Philipp Hasenfratz: MySQL auf sich selbst joinen?

Beitrag lesen

Halihallo XMen

So, ich habe mich über meine Dummheiten in diesem Thread so aufgeregt, dass ich erstmal
etwas Beach-Volleyball spielen musste :-)
Irgendwann hat's mich doch ziemlich stark auf meine "Birne" geknallt und da hatte ich
dann folgende Idee: ;)

SELECT a.text, a.group_id, MAX(b.id) AS max_id
   FROM
      tb1 AS a,
      tb2 AS b
   WHERE
      a.group_id=b.group_id AND
      a.num=1
   GROUP BY
      a.id,b.group_id
   HAVING
      a.id=max_id

So, dies sollte jetzt wieder viel performanter sein. Ich hatte mir vorher wenig dabei
gedacht und das Grundprinzip "Möglichst schnell die Datenmenge verkleinern" völlig
ausser acht gelassen. Durch die WHERE-Condition dass a.group_id=b.group_id reduziert
sich die Datenmenge um ein vielfaches und die Performance steigt, zudem kommt der Index
wesentlich besser zum tragen. Dies ist zwar immer noch nicht sehr performant, aber
sicher besser als 15 Sekunden.

Soviel zu dem, falls dies dann immer noch nicht performant sein sollte, was ich aber
nicht glaube, folgendes:

SELECT MAX(id)
   FROM
      tb1
   WHERE
      num=1
   GROUP BY group_id

mit den MAX(id)'s machst du folgendes:

SELECT text
   FROM
      tb1
   WHERE
      id IN ([Komma-Liste-von-MAX(id)'s])
   ORDER BY
      id DESC

sollte ziemlich performant sein.

dein Vorschlag: "SELECT text, MAX(id) AS max_id FROM table WHERE num='1' GROUP BY
group_id ORDER BY max_id DESC"

Nun ja, ORDER BY max_id ist unglücklich, den würde ich im zweiten Query schreiben, da
dann der Unique Index des Primary Keys (id) verwendet werden kann => wesentlich
schneller. Bei deinem Query müsste zuerst gruppiert werden und auf der temporären
Zwischenergebnistabelle sortiert werden (dauert länger). Zudem hat hier "text" wirklich
_nichts_ zu suchen! - Wie gesagt, das ist ein "Bug" in MySQL. text darf nur ohne
Agregatsfunktionen (SUM/AVG/MAX/MIN/COUNT) vorkommen, wenn du nach dem Primary Key 'id'
auf dieselbe Tabelle gruppierst. Du hast richtig festgestellt, dass MySQL hier einen
zufälligen Text auswählt.

Und wenn ich jetzt nochmals einen Denkfehler habe, geh ich schlafen, Himmel noch eins!
;-)

Viele Grüsse

Philipp

--
RTFM! - Foren steigern das Aufkommen von Redundanz im Internet, danke für das lesen der Manuals.
Selbstbedienung! - Das SelfForum ist ein Gratis-Restaurant mit Selbstbedienung, Menüangebot steht in den </faq/> und dem </archiv/>.