globe: Ergebnismenge erneut sortieren - die Lösung

Beitrag lesen

n'abend,

Genau so weit war ich, deswegen habe ich ja meine Versuche mit Union gemacht...

Mittels UNION schweißt du die Ergebnismengen zweier Abfragen zu einer Ergebnismenge zusammen.

SELECT query, SUM(anzahl) as wieviel, COUNT() as anzahl
FROM tabelle
WHERE query IN (
  SELECT query
  FROM tabelle
  GROUP BY query
  ORDER BY SUM(anzahl) DESC, COUNT(
) DESC
)
GROUP BY query
ORDER BY query ASC
LIMIT 50


> läuft die Anfrage in ein Timeout, auf dem lokalen Testserver ohne Beschränkung rechnet es 112 Sekunden... nicht so performant.  
  
Was daran liegt, dass das eine ziemlich dämliche Abfrage ist und der Query-Optimizer da wohl nicht das macht, was man sich wünscht. (Nämlich erkennen, dass er die Aggregatfunktionen der äußeren Query nicht erneut durchlaufen muss, sondern die Ergebnisse der inneren Query nehmen kann...)  
  
Wenn wir betrachten, was hier passiert, wird uns auch klar, warum das so verdammt lange dauert:  
[innere Query]  
(1-1) Alle Datensätze werden nach dem Feld query gruppiert  
(1-2) Die Summen des anzahl-Feldes pro Gruppe wird berechnet  
(1-3) Die Anzahl Datensätze pro Gruppe wird berechnet  
(1-4) Die Ergebnismenge wird zuerst nach der Anzahl (1-3), dann nach der Summe (1-2) sortiert  
[äußere Query]  
(2-5) Die Datensätze werden gesucht, deren query-Feld einem der Werte der SubQuery entspricht  
(2-6) Die gefundenen Datensätze werden nach dem Feld query gruppiert  
(2-7) Die Summen des anzahl-Feldes pro Gruppe wird berechnet  
(2-8) Die Anzahl Datensätze pro Gruppe wird berechnet  
(2-9) Die Ergebnismenge wird zuerst nach dem Feld query Sortiert  
  
Wir machen an dieser Stelle also jede Berechnung doppelt.  
  

> > ~~~sql
  

> > SELECT t.*  
> > FROM (  
> >   SELECT query, SUM(anzahl) as wieviel, COUNT(*) as anzahl  
> >   FROM tabelle  
> >   GROUP BY query  
> >   ORDER BY wieviel DESC, anzahl DESC  
> >   LIMIT 50 /* <- kann von MySQL5 als fehler angesehen werden */  
> > ) AS t  
> > ORDER BY t.query ASC /* gehe mal von aus, dass du nach query sortieren willst */  
> > 

Genau das ist es!

Hier machen wir die obigen Schritte (1-1) bis (1-4) durch. Danach berechnen wir aber keine weiteren Dinge, sondern sortieren die Ergebnismenge lediglich neu.

Hat die LIMIT Klausel denn zu Problemen geführt? Welches DBMS setzt du überhaupt ein?

Besten Dank und Gruß an den großen See...

Blubberige Grüße zurück nach E-Punkt :)

weiterhin schönen abend...

--
Freundlich wie man war, hat man mir Großbuchstaben geschenkt.
sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|