PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SQL] Query "group by" mit Ausnahme



jpwfour
10.09.2009, 16:35
Aus einer Tabelle:
id|value|cat
1|1111|0
2|2222|1
3|3333|0
4|4444|1
5|5555|2
6|6666|2
7|7777|0


Will ich alle Einträge, die kein (=0) cat haben, einzeln betrachten, alle mit cat>0 aber als Gruppe.

Und diese dann sortiert nach value bzw. SUM(value) ausgeben lassen, dabei dann zur Zuordnung id und cat dazu, wird halt je nach Fall 1er der beiden Werte ignoriert.

Ausgabe sollte also sein:
id|cat|value
5|2|12221
7|0|7777
2|1|6666
3|0|3333
1|0|1111


Dabei die relevanten Werte fett markiert von id & cat.

Das bekomm ich zwar hin, aber relativ umständlich und nicht gerade sehr performant:



( SELECT id, cat, SUM( value ) AS value
FROM `test`
WHERE cat >0
GROUP BY cat
ORDER BY SUM( value ) DESC
LIMIT 5
)
UNION (
SELECT id, cat, value
FROM `test`
WHERE cat =0
ORDER BY value DESC
LIMIT 5
)
ORDER BY value DESC
LIMIT 5
Index auf
id (auto_increment)
cat
value
cat, value (cat_2)

Also erstmal (Ergebnisszeilen 1+3) die gruppierten, dann (Zeilen 2,4,5) alle ohne cat, und die beiden Ergebnisse zusammengefügt und nochmal nach value sortiert (und LIMIT)

Hat da jemand 'ne bessere/schnellere/einfachere Idee?

EXPLAIN....

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY test ALL cat,cat_2 NULL NULL NULL 7 Using where; Using temporary; Using filesort
2 UNION test ref cat,cat_2 cat_2 4 const 5 Using where
NULL UNION RESULT <union1,2> ALL NULL NULL NULL NULL NULL Using filesort