SQL: ВЫБЕРИТЕ с помощью UNION, ORDER BY и LIMIT - PullRequest
5 голосов
/ 15 января 2011

Я получаю ошибки, по которым заказ должен поступить после UNION, но я хочу, чтобы эти запросы были заказаны, прежде чем объединены в единицу, а затем ограничены 10.

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

Я надеюсь, вы понимаете, что япытается сделать и может мне помочь; -)

Ответы [ 5 ]

22 голосов
/ 01 февраля 2012

если у вас очень сложный запрос в SQLite, но вам нужно использовать UNION с порядком, то вы можете попробовать

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
    )
7 голосов
/ 15 января 2011

Порядок по повлияет на ВЕСЬ союз.

В любом случае, похоже, что вам нужны строки, ближайшие к now.Вы можете попробовать это:

SELECT   time, x, y, z 
FROM     db 
ORDER BY ABS(time - now) ASC
LIMIT    10
4 голосов
/ 15 января 2011

В «стандартном» (для некоторого определения «стандартном») 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

Как ограничить количество строк в результирующем наборе, может варьироваться в зависимости от реализации SQL.

4 голосов
/ 15 января 2011

Это не так, по крайней мере, в MySQL (вы не указали). Операция ORDER выполняется после выбора данных и выполнения всех UNION, GROUP BY и т. Д.

См. SQL Server: ORDER BY в подзапросе с UNION , чтобы обойти это.

2 голосов
/ 05 августа 2015

Любое простое решение, которое я применил, было следующим:

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;

Упорядочивает результаты по второму столбцу (дате).

Если столбец даты является строкой, вы можете применить функцию TO_DATE, как показано выше, иначе это не нужно.

...