2016-05-07 10 views
1

ich eine MySQL-Tabelle wie folgt aus:Zwei mysql wählt in einer Abfrage - einer nach dem anderen

+----+------+ 
| id | rank | 
+----+------+ 
| 1 | 2 | 
+----+------+ 
| 2 | -1 | 
+----+------+ 
| 3 | 5 | 
+----+------+ 
| 4 | 1 | 
+----+------+ 
| 5 | -1 | 
+----+------+ 
| 6 | -1 | 
+----+------+ 
| 7 | 8 | 
+----+------+ 
| 8 | -1 | 
+----+------+ 

Jetzt möchte ich die IDs in der folgenden Reihenfolge bekommen: Zuerst

WHERE rank >= 1 ORDER BY rank ASC 

und danach:

WHERE rank = -1 

Wie kann ich dies in nur einem mysql_query()?

+0

warum schreiben Sie nicht 2 Fragen? –

+3

ORDER BY CASE WENN Rang> = 1 THEN 0 ELSE 1, Rang – Mihai

+0

Kompliziert. Der Rest der Codestruktur erwartet nur eine Abfrage. Wenn ich keine Lösung finden kann, werde ich sie bearbeiten und zwei Abfragen verwenden. Aber das wird eine Menge Arbeit sein, also frag besser vorher. ;) – user3362305

Antwort

1

Versuchen Sie so etwas wie:

SELECT * 
FROM mytable 
WHERE rank >= 1 
ORDER BY rank 
UNION 
SELECT * 
FROM mytable 
WHERE rank = -1 

ODER so etwas wie:

SELECT * 
FROM mytable 
WHERE rank >= 1 
ORDER BY CASE WHEN rank>=1 
       THEN 0 
       ELSE 1,rank 
0

Vorgeschlagene Antwort:

SELECT id FROM myTable WHERE rank >= 1 ORDER BY rank ASC 
UNION 
SELECT id FROM myTable WHERE rank = -1 

Von meinem Verständnis, eine Spalte von ids wollte, beginnend mit den IDs WHERE rank >= 1 ORDER BY rank ASC und endend mit der ID s WHERE rank = -1.

Die vorherige SQL-Abfrage verwendet UNION, die zwei resultierende Tabellen aus separaten SELECT Abfragen verbindet. UNION kann nur angewendet werden, wenn Sie aus jeder SELECT Abfrage das gleiche Mount von generierten Spalten haben. Dies ist ein guter Gedanke, den Sie berücksichtigen sollten, wenn Sie später die Anzahl der erhaltenen Spalten erhöhen möchten.

0

Sie können auch Rang mit ELT zuordnen.

Probe

SELECT * 
FROM mytable 
ORDER BY ELT(rank+2,99,0,1,2,3,4,5,6,7,8) ASC; 
Verwandte Themen