Aus einer Tabelle:
[tableold="head"]id|value|cat
1|1111|0
2|2222|1
3|3333|0
4|4444|1
5|5555|2
6|6666|2
7|7777|0
[/tableold]

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:
[tableold="head"]id|cat|value
5|2|12221
7|0|7777
2|1|6666
3|0|3333
1|0|1111
[/tableold]

Dabei die relevanten Werte fett markiert von id & cat.

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

Code:
( 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....
Code:
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