phpbar.de logo

Mailinglisten-Archive

[php] [OT] dringend SQL-Könner gesucht

[php] [OT] dringend SQL-Könner gesucht

Yannik Hampe yannik at cipher-code.de
Mit Feb 27 10:03:55 CET 2008



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