Wie löse ich folgendes in einem MySQL Ausdruck?
-
Hallo,
Ich habe eien Tabelle Downloads.
Diese tabelle hat die beiden Spalten: id, parentid
Die Tabelle kann Kategorien enthalen, wobei dann parentid NULL ist, oder auch Downloads selber, wobei parentid dann gleich der ID der dazugehörigen Kategorie ist.
Jetzt will ich einen Ausdruck machen:$result = @mysql_query("???"); while($myrow = @mysql_fetch_array($result)) { ... }
Hierbei sollen die Kategorien ausgegeben werden.
Aber zusätzlich zu parentid und id soll jetzt noch ein Feld dazukommen (durch den Ausdruck) in dem steht, wie viele Downloads die parentid der Kategorie haben.Also z.B. bei folgenden Einträgen:
id parentid 1 NULL 2 NULL 3 NULL 4 1 5 1 6 2 7 1 8 3 9 2
Jetzt findet er natürlich als Erstes das mit der ID 1.
Und bei mysql_fetch_array soll in myrow jetzt später noch ein Eintrag ,,Downloads'' oder so sein, in dem steht wie viele Downloads die parentid 1 haben.
Das wären in dem Fall also 3, also wäre myrow[Downloads] = 3.Jo, geht das?
Wenn ja wie?Mfg MAV
-
SELECT t1.id, COUNT( t2.id ) FROM temp AS t1 LEFT JOIN temp AS t2 ON t1.id = t2.parent_id WHERE t1.parent_id IS NULL GROUP BY t1.id
-
Oh fein. ^^
Öhm, kannst du das erklären?
Also bis zu einem gewissenMaß kann ichs auch noch:SELECT t1.id, COUNT( t2.id )
FROM temp AS t1
LEFT JOIN temp AS t2 ON t1.id = t2.parent_id
WHERE t1.parent_id IS NULL
GROUP BY t1.idEs wird von t1 die ID ausgewählt und die Anzahl der t2s werden gezählt?
Naja jedenfalls von temp und das was hiervon ausgewählt wird wird t1 genannt.
und kommt LEFT JOIN (was das ist, muss ich noch nachschlagen) von temp und das wird t2 genannt.
Dabei ist die ID von t1 als parent_id von t2 zu gebrauchen.
Und ausgewählt für den gesamten Ausdruck werden jetzt nur welche, die auch parentid NULL haben.Oh Mann, das ist wieder ein ganz neuer Teil der Informatik, den ich kaum beherrsche, sehr gut, danke, ich werde mit deinem Code ein wenig rumexperimentieren.
Mfg MAV
-
temp war der Name der Tabelle bei mir auf dem Rechner
Die Tabelle wird mit sich selber verknüpft deswegen muss man ihr mir AS 2 unterschiedliche Namen geben. Als Verknüpfungsbedingung wird hier definiert, dass die id aus t1 mit der parent_id aus t2 übereinstimmen soll.
Über das WHERE sagst du jetzt noch, dass du nur diejenigen Zeilen haben willst, die für eine Kategorie stehen.
Mit dem GROUP BY und COUNT werden jetzt die Zeilen Kategorieweise zusammengefasst und die Anzahl der ids gezählt, die t1.id als Parent haben
-
Gut, ich habe ihn größtenteils verstanden.
Bis auf das GROUP BY und das COUNT.
Wieso zählt COUNT hier t2.id und nicht einfach t2?
Es zählt doch eigentlich, wie oft t2 bei t1 zutrifft...
Und GROUP BY...
Hier verstehe ich überhaupt nicht, wozuHm, bei COUNT(*) statt COUNT(t2.id) wird bei einem Downloadkategorie angezeigt, dass da 1 statt 0 Downloads drin wären, wie kommt das?
Mfg MAV
-
Wenn kein Download vorhanden ist wird bei der Verknüpfung für alle Felder aus t2 NULL eingesetzt. Also hast du eine Zeile (was COUNT(*) ja zählt, COUNT(t2.id) zählt aber NULL nicht mit)
Für ein COUNT(t2.id) brauchst du ein GROUP BY - bekommst sonst auch nen Fehler in phpmyadmin angezeigt
-
Gut, COUNT ist auch völlig verstanden.
Jetzt verstehe ich aber leider GROUP BY immer noch nicht ganzAch und wieso LEFT JOIN?
Was ist das Besondere an LEFT JOIN im Gegensatz zu JOIN?
-
Vielleicht hilft dir die Fehlermeldung, die du bekommst, wenn du das GROUP BY weglässt
Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause
Zum JOIN muss ich gestehen, dass ich das grad gar nicht genau weiß - ich hab den halt immer genommen (ist net so mein Spezialgebiet)
evtl. hilft dir hier aber die Doku beim Verständnis weiter: http://www.mysql.com/doc/de/JOIN.html
-
Wenn es für die rechte Tabelle keinen übereinstimmenden Datensatz im ON- oder USING-Teil eines LEFT JOIN gibt, wird für die rechte Tabelle eine Zeile benutzt, in der alle Spalten auf NULL gesetzt sind. Das können Sie benutzen, um Datensätze in einer Tabelle herauszusuchen, die in einer anderen Tabelle kein Gegenstück haben.
Aber schau dir einfach mal die Ergebnisse an, die du durch die einzelnen Verknüpfungen bekommst
-
Hm, schon verstanden.
OK, also man braucht für COUNT(???) immer ein GROUP BY(???)
Wenn man es nicht macht, ist es laut PHP Fehlermeldugn ungültig.
Äh, aber wieso braucht er das GROUP BY denn jetzt intern, das ist ja jetzt wohl nicht nur einfach so mal nötig, weil die Programmierer fanden, dass ein GROUP BY am Ende des Query fein aussieht. *g*
-
Du darfst eben keine GROUP columns (MIN(),MAX(),COUNT()...) mint Nicht-GROUP columns mixen, ohne GROUP BY zu verwenden, denn welchen Wert sollte er jetzt für die einzelnen Zeilen des Result-Sets verwenden?! Durch das GROUP BY werden jetzt jeweils die ganzen Zeilen Kategorie-weise zusammengefasst, sodass die GROUP Funktionen jeweils auf die Datensätze der Kategorie angewandt werden.
Ich hoffe, das war jetzt verständlich. btw: das ist keine PHP-Fehlermeldung, sondern eine von MySQL
-
Ja, schon eher.
Fehlermeldung: Äh klar