mysql Verknüpfen von Abfrage mit Ergebnissen einer vorherigen Abfrage

sdave

Grünschnabel
Hallo,

Ich habe ein Problem, das wahrscheinlich schnell gelöst ist oder gar nicht ;-)
Und zwar möchte ich quasi eine Tabelle nach Spalte A sortieren, davon die obersten zehn Einträge auslesen
(SELECT * FROM tabelle WHERE 1 ORDER BY SpalteA DESC LIMIT 0,10)
Danach möchte ich den Rest, der nicht zu den zehn Einträgen gehört nach einer anderen Spalte sortieren.

Die Entscheidung mit zwei getrennten Abfragen und PHP dazwischen ist natürlich möglich, aber dafür gibt es doch bestimmt eine Lösung in mysql?

Würde mich über Vorschläge freuen.
 
Hi

Versuch sowas:
SQL:
SELECT * FROM (SELECT c1,c2,c3 FROM t1 ORDER BY c1 DESC LIMIT 0, 10) as t1a
UNION ALL
SELECT * FROM (SELECT c1,c2,c3 FROM t1 ORDER BY c2 DESC LIMIT 10, 18446744073709551615) as t1b
für die Spalten c1,c2,c3 aus Tabelle t1, einmal gesortet nach c1, einmal nach c2.

Was SELECT c1,c2,c3 FROM t1 ORDER BY c1 DESC LIMIT 0, 10 macht ist klar.

Bei SELECT c1,c2,c3 FROM t1 ORDER BY c2 DESC LIMIT 10, 18446744073709551615
ist einerseits die Sortierung anders (klar), andererseits das Limit:
Im Allgemeinen ist die erste Zahl die Startnummer und die zweite die Anzahl, so wie bei 0,10.
Hier wird bei 10 gestartet... und ein "bis zum Ende" gibts leider nicht, also steht da die
maximale Zeilennummer für eine Mysql-Tabelle drin (natürlich macht es nichts, wenn
die Tabelle gesamt nicht so viele Zeilen hat)
Ja, so eine Nummer schaut nicht schön aus, geht aber (meines Wissens nach) nicht anders.

UNION ALL fasst die Resultate von zwei Abfragen zusammen, ohne Doppelfilterung.
Geht nur, wenn beide die selbe Anzahl und Art von Spalten haben, also wenn die
erste Unterabfrage c1,c2,c3 selectet muss die zweite das genau gleich machen.

Ein Problem mit UNION ALL ist, dass man für beide Teilabfragen normalerweise
nur eine Sortierung ganz am Ende angeben kann, deswegen sind beide Abfragen
noch einmal in Unterabfragen SELECT * FROM () as t1a bzw.
SELECT * FROM () as t1b verpackt.
 
Dankeschön! Den Trick mit den umschließenden SELECTS kannte ich noch nicht.
Damit hat es jetzt geklappt:

SQL:
SELECT c1, c2, c3 FROM (SELECT * FROM t1 ORDER BY c1 DESC LIMIT 10) AS t1a
UNION ALL
SELECT c1, c2, c3 FROM (SELECT * FROM (SELECT * FROM t1 ORDER BY c1 DESC LIMIT 10,100000) AS t1b ORDER BY c2 ASC) AS t1c
 

Neue Beiträge

Zurück