Pit: Query Grundsatzfrage

Beitrag lesen

Hallo Rolf,

In einfachen Fällen, wenn Du tatsächlich nur eine Liste von Werten kommasepariert in einer Liste haben willst und diese Liste nicht wieder zerlegen musst, ist GROUP_CONCAT() die einfachere Lösung und erspart Dir Arbeit im PHP.

Stimmt. Im konkreten Fall habe ich es zwar doch noch etwas anders gemacht, aber prinzipiell sehe ich das genauso wie Du.

In deiner Problemstellung würde das hinreichen. Du solltest dann aber erst gruppieren und dann joinen, das reduziert die Arbeit im Server (es sei denn der Optimizer kriegt das selbst hin - EXPLAIN it).

SELECT MID, R_ids, Art, Datum
FROM (SELECT MID, GROUP_CONCAT(R_id) as R_ids 
         FROM marke GROUP BY MID) m
  JOIN M_Container c ON m.MID=c.MID

sollte effizienter sein als

SELECT MID, GROUP_CONCAT(R_id), Art, Datum
FROM marke m
  JOIN M_Container c ON m.MID=c.MID
GROUP BY MID, Art, Datum

Werde ich mal spaßeshalber prüfen 😀 Muß aber bis zum WE warten...

Das Folgende geht übrigens auch:

Und ja: Alle Spalten, die nicht aggregiert werden, müssen im GROUP BY aufgelistet werden. MYSQL würde es auch zulassen, nur MID im GROUP BY anzugeben und in diesem Fall würde das sogar zu einem deterministischen Ergebnis führen. Tatsächlich ist es aber ungültiges SQL und kann zu merkwürdigen Fehlern führen, wenn MID in der M_Container Tabelle nicht unique ist. Man gewöhnt es sich am besten gar nicht erst an.

Du hast Recht. In mienem Fall war zwar die MID der primary Index autoincrement, aber grundsätzlich müssen alle Spalten, die nciht aggregiert werden ins GROUP BY.

Danke für Deine Antwort und viele Grüße,

Pit