2011-01-14 5 views
5

Ich erhalte Fehler, die ORDER von nach UNION kommen sollte, aber ich möchte diese Anfragen bestellt, bevor zu einem zusammengefasst und dann darauf beschränkt 10.SQL: SELECT mit UNION, ORDER BY und LIMIT

SELECT * 
    FROM (SELECT time, x, y, z 
      FROM db 
     WHERE time >= now 
     ORDER by time, x 
     UNION 
     SELECT time, x, y, z 
     FROM db 
     WHERE time < now 
    ORDER by time, x) 
LIMIT 10 

I Ich hoffe, Sie verstehen, was ich versuche zu tun und kann mir helfen ;-)

+0

Es ist für SQLITE: android.database.sqlite.SQLiteException: ORDER BY-Klausel sollte nach UNION nicht vorher kommen: –

Antwort

4

Das ist nicht, wie es funktioniert, zumindest in MySQL (Sie haben nicht angegeben). Die ORDER-Operation wird ausgeführt, nachdem die Daten ausgewählt und alle UNIONs, GROUP BYs usw. ausgeführt wurden.

Siehe SQL Server: ORDER BY in subquery with UNION für einen Weg um dies.

7

Eine Reihenfolge nach wird die gesamte Einheit beeinflussen.

Wie auch immer, es sieht so aus, als ob Sie die Zeilen am nächsten zu now möchten. Sie können dies versuchen:

SELECT time, x, y, z 
FROM  db 
ORDER BY ABS(time - now) ASC 
LIMIT 10 
+0

Danke, ich denke, das ist es .. –

4

In "Standard" (für einige Definition von "Standard") SQL;

select top 10 * 
from (  select time,x,y,z from db where time > now 
     union select time,x,y,z from db where time < now 
    ) t 
order by t.time 

Wie die Anzahl der Zeilen in der Ergebnismenge begrenzt wird, kann zwischen SQL-Implementierungen variieren.

21

wenn Sie eine sehr komplexe Abfrage in SQLite, sondern müssen UNION mit der Bestellung verwenden, dann können Sie versuchen,

 
select * from (
    select * from b ORDER BY date asc 
    ) 
UNION 
select * from (
    select * from b ORDER BY name desc 
    ) 
UNION 
select * from (
    select * from b ORDER BY gender asc 
    ) 
2

Jede einfache Lösung Ich war wie folgt angewandt:

SELECT 
name, 
TO_DATE(date1, 'DD-MON-YYYY HH:MI AM') 
FROM TableX 

UNION 

SELECT 
name, 
TO_DATE(date2, 'DD-MON-YYYY HH:MI AM') 
FROM TableY 

ORDER BY 2 DESC; 

Diese Aufträge die Ergebnisse nach der zweiten Spalte (Datum).

Wenn die Datumsspalte eine Zeichenfolge ist, können Sie die TO_DATE-Funktion wie oben gezeigt anwenden, sonst ist es nicht erforderlich.