Mailinglisten-Archive |
jens schmidt wrote: > Moin Liste, > > ich weiß, ich weiß: das gehört hier nicht hin, bitte nicht zu sehr > meckern. Ich kenne leider keine entsprechende SQL-Liste und es eilt > ein wenig. Vielleicht kann hier jemand einen weiterbringenden Hinweis > geben. Wieso sollte es nicht hierhin gehören? Ist doch ein typisches problem beim bei php-Anwendungen :-). > > Folgendes Problem: > Ich habe zwei Tabellen A, B, die über eine dritte A2B in einer m:n- > Relation verknüpft sind. > A enthält Texte, B Bilder. > Den Texten A können Bilder zugeordnet sein, müssen aber nicht. > A2B enthält für bestimmte Zuordnungen noch ein Flag (0/1), das diesem > Bild dann bestimmte Eigenschaften bzgl. des Textes zuweist. > > Ich benötige nun alle Texte und, so vorhanden, das Bild, dessen Flag > eine 1 hat. Das ganze nach einem Datum geordnet. > Der Query sieht stark vereinfacht zunächst so aus: > > SELECT * FROM A > LEFT JOIN A2B ON A.id = A2B.a_id > GROUP BY A.id > ORDER BY A.display_date DESC Die Tabelle B kommt jetzt in deinem Query garnicht vor?! Ich baue den mal so, wie ich es verstanden habe: SELECT * FROM a LEFT JOIN a2b ON a.id=a2b.a_id LEFT JOIN b ON a2b.b_id=b.id WHERE b.flag=1 GROUP BY a.id ORDER BY deinDatum > > Die GROUP BY Anweisung soll natürlich dafür sorgen, dass jeder Text > nur ein mal ausgegeben wird. Das Dumme ist, dass hierbei gerne auch > Tupel überbleiben, deren Flag 0 ist, obwohl es zu diesem Text auch > welche gibt, die eine 1 haben (es steht ja auch bis jetzt nicht drin, > dass das anders sein soll). > > Ergebnis ohne GROUP BY und HAVING z.B: > > id_a1, Text_a1, id_b1, flag_b_0 <- der kommt zB. in die Gruppe > id_a1, Text_a1, id_b2, flag_b_1 <- den will ich aber haben!! > id_a1, Text_a1, id_b3, flag_b_0 > id_a2, Text_a2, NULL, NULL <- den natürlich auch > id_a3, Text_a3, id_bx, flag_b_1 <- den auch > > Eigentlich sollte HAVING flag = '1' nach GROUP BY helfen (Flag ist > vom Typ enum, deswegen die Hochkommata), dachte ich, dann gibts aber > ein leeres Ergebnis. Um Gottes willen... HAVING wird erst nach dem GROUP BY ausgeführt. In jedem Fall brauchst du ein WHERE, damit deine 0-en schon vor dem GROUB BY verschwinden. WHERE ist übrigens dadurch auch viel schneller als HAVING. > > Für weiterhelfende Tipps dankbar ist: > Jens. :) > > Schön' Tach! > Yannik
php::bar PHP Wiki - Listenarchive