Yii Framework Forum: count(*) - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

count(*) Rate Topic: -----

#1 User is offline   yii 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 440
  • Joined: 25-July 09

Posted 27 October 2009 - 01:37 PM

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 = "*";

Meine Fragen stelle ich öffentlich und baue somit eine Wissensdatenbank für andere auf!
0

#2 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 28 October 2009 - 03:35 AM

View Postyii, on 27 October 2009 - 01:37 PM, said:

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

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



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.
0

#3 User is offline   yii 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 440
  • Joined: 25-July 09

Posted 28 October 2009 - 09:51 AM

ok, das habe ich überlesen.
Aber wie kann ich nun den Stern an Count übergeben?
Meine Fragen stelle ich öffentlich und baue somit eine Wissensdatenbank für andere auf!
0

#4 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 29 October 2009 - 03:38 AM

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.
0

#5 User is offline   yii 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 440
  • Joined: 25-July 09

Posted 29 October 2009 - 06:27 PM

Ja ich habe ein INNER JOIN.

Ich brauche das with() um zuzählen, wie viele Verknüpfungen ist zu einem Element habe
Meine Fragen stelle ich öffentlich und baue somit eine Wissensdatenbank für andere auf!
0

#6 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 30 October 2009 - 03:12 AM

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?
0

#7 User is offline   yii 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 440
  • Joined: 25-July 09

Posted 30 October 2009 - 03:41 AM

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
Meine Fragen stelle ich öffentlich und baue somit eine Wissensdatenbank für andere auf!
0

#8 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 30 October 2009 - 03:59 AM

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.
0

#9 User is offline   yii 

  • Advanced Member
  • PipPipPip
  • Yii
  • Group: Members
  • Posts: 440
  • Joined: 25-July 09

Posted 30 October 2009 - 10:05 AM

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 );

Meine Fragen stelle ich öffentlich und baue somit eine Wissensdatenbank für andere auf!
0

#10 User is offline   Mike 

  • Elite Member
  • PipPipPipPipPip
  • Yii
  • Group: Members
  • Posts: 3,016
  • Joined: 06-October 08
  • Location:Upper Palatinate

Posted 30 October 2009 - 02:35 PM

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') );

0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users