count(*)

Hallo,

laut dem yii-guide gilt der Stern als default - Auswahl


select: the statistical expression. Defaults to COUNT(*), meaning the count of child objects.

Meine Methode




	$criteria = new CDbCriteria;

	$criteria->condition = "xxx.baseform='lalala'";

	echo xxx::model()->with('next')->count( $criteria );



Yii macht daraus aber ein DISTINCT id


(SELECT COUNT(DISTINCT `xxx`.`id`) FROM ....

Wenn ich diese Condition hinzufüge, passiert nichts.


	$criteria->select = "*";

Das bezieht sich auf weitere Optionen für Relations mit self::STAT. Du machst aber hier was ganz anderes: Eine count() Abfrage auf dem xxx-Model.

ok, das habe ich überlesen.

Aber wie kann ich nun den Stern an Count übergeben?

Hast du bei der ‘next’ relation ein ‘INNER JOIN’ definiert? Andernfalls würd ich die count()-Abfrage ohne with() machen. Wenn du with() verwendest ist DISTINCT() wegen der JOINs nötig.

Ja ich habe ein INNER JOIN.

Ich brauche das with() um zuzählen, wie viele Verknüpfungen ist zu einem Element habe

Hmm. Ohne jetzt intensiv drüber nachgedacht zu haben behaupte ich mal: Du kannst nicht mit einem einzigen SQL-Statement beides Abfragen: Anzahl der Einträge in der Haupttabelle + Anzahl der jeweils dazu verknüpften Einträge in einer anderen Tabelle.

Oder kannst du mir mal das SQL zeigen, das generiert werden soll?

Das macht er // -> 1


SELECT COUNT(DISTINCT(entry.id)) FROM entry

INNER JOIN entry_solution ON (entry.id=entry_solution.entryId) 

INNER JOIN solution ON (entry_sloution.solutionId=solution.id)

Das will ich // -> 5


SELECT COUNT(entry.id) FROM entry

INNER JOIN entry_solution ON (entry.id=entry_solution.entryId) 

INNER JOIN solution ON (entry_sloution.solutionId=solution.id)

Ich habe schon mit CDbCriteria rumgespielt, aber bisher hat nichts gebracht.

Die einzige Möglichkeit wäre das Statement so in eine Funktion zu übergeben und auszuführen, aber da ich schon die relations definiert habe, wäre es eleganter über diese Count auszuführen.

Andere Möglichkeit wäre es in einer for-Schleife die Ergebnisse zu zählen, jedoch ist das Perfomance-technisch nicht zu empfehlen

Ok, das kann man logisch umwandeln zu “Liefer mir die Gesamtanzahl aller Einträge in entry_solution, für die ein passender Eintrag in entry existiert” (zumindest ist das das, was rauskommt, wenn du das DISTINCT weglässt). Also willst du eigentlich nicht entry sondern entry_solution abfragen. D.h. wenn du in entry_solution nen INNER_JOIN zu entry hinzufügst und dann ->with(‘entry’)->count() auf entry_solution machst, solltest du das richtige Ergebnis bekommen.

Ich habe das nun bisschen anders gelöst.

Ich rufe die Zwischentabelle auf und führe durch ein count mit der ID aus. ca. so




$criteria->condition= "id=1";

Zwischentabelle::model()->count( $criteria );



Kleiner Tipp noch: Du kannst die Criteria-Attribute auch einfach als Array an find*() übergeben. Ist noch etwas kürzer:


Zwischentabelle::model()->count( array(condition=>'id=1') );