Rolf B: Query Grundsatzfrage

Beitrag lesen

Hallo Pit,

autsch. Gruppenbruch ist Denglisch, und dazu noch blödsinniges. Wenn man das break in control break schon beibehalten will, dann sollte man es auch vollständig tun und von einer Steuerungsunterbrechung sprechen, in dem Sinne, dass man in der Steuerung des Programmablaufs eine Unterbrechung vorsieht, um den Übergang von einem Schlüsselbegriff zum anderen zu behandeln.

Das deutsch Wort Gruppenwechsel beschreibt das meiner Meinung nach viel besser als das englische control break[1].

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.

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

Das Folgende geht übrigens auch:

SELECT MID,
       (SELECT GROUP_CONCAT(R_id) 
          FROM marke m 
          WHERE m.MID=c.MID) as R_id,
       Art,
       Datum
FROM  M_Container c

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.

Rolf

--
sumpsi - posui - clusi

  1. und das müsste ja seit deutscher Tastaturen sowieso eigentlich String-Unterbrechung heißen! ↩︎