Rolf B: zwei Abfragen in einer MySQL Abfrage?

Beitrag lesen

Hallo Bernd,

okay, so bekommst Du alle Projekte, die Bilder haben. Die Anzahl fehlt.

Aber warum jetzt ein neuer Ansatz? Du warst doch schon fast am Ziel. Es fehlte nur ein dummes, kleines Komma. Ich dachte, mein kommafreier Satz hätte Dich drauf gebracht.

SELECT p_code, p_titel, p_von, p_bis (SELECT COUNT(*) FROM projektbilder WHERE bild_refID = p_code ) as anz_bilder FROM projekte

Was inhaltlich noch fehlt, ist die Begrenzung auf Projekte mit Bildern.

MYSQL erlaubt Dinge, die sonst nirgends gehen. Darum weiß ich nicht, ob man eine Subselect-Spalte in einer WHERE Bedingung verwenden darf. MS SQL Server erlaubt es nicht. Also dies hier:

SELECT p_code, p_titel, p_von, p_bis,
       (SELECT COUNT(*) FROM projektbilder 
        WHERE bild_refID = p_code ) as anz_bilder 
FROM projekte
WHERE anzahl > 0

Wenn MySQL das erlaubt, wäre es das, was Du brauchst. Denke ich.

Wenn nicht - normgerechteres SQL sähe so aus:

SELECT * 
FROM (SELECT p_code, p_titel, p_von, p_bis,
             (SELECT COUNT(*) FROM projektbilder 
              WHERE bild_refID = p_code ) as anz_bilder 
      FROM projekte) X
WHERE anzahl > 0

Alternativ mit einem Inner Join, das ist das gleiche wie ein LEFT JOIN bei dem man abfragt ob keine Sätze zugemischt wurden:

SELECT p_code, p_titel, p_von, p_bis, COUNT(*)
FROM projekte P JOIN projektbilder B ON B.bild_refID = P.p_code
GROUP BY p_code, p_titel, p_von, p_bis

In MYSQL reicht es, p_code ins GROUP BY zu schreiben, sofern es zu einem p_code nur einen Satz in der projekte-Tabelle gibt. Normgerechtere DBs verlangen, dass alle SELECT-Spalten, die nicht aggregiert werden, im GROUP BY gelistet sind und damit auch an der Gruppierung teilnehmen (was bei eindeutigem p_code zum gleichen Ergebnis führt).

Rolf

--
sumpsi - posui - clusi