СОЮЗ после ORDER BY и LIMIT - PullRequest
       29

СОЮЗ после ORDER BY и LIMIT

20 голосов
/ 01 июня 2011

Моя цель - выполнить два разных запроса и затем объединить их.
Мой код:

SELECT * FROM some tables WHERE ... ORDER BY field1 LIMIT 0,1 
UNION   
SELECT * FROM some tables WHERE ...

Я получаю следующую ошибку:

# 1221 -Неправильное использование UNION и ORDER BY

Важно, чтобы ORDER BY был только для первого запроса.Как я могу выполнить эту задачу?

Ответы [ 4 ]

26 голосов
/ 01 июня 2011

Вы можете использовать скобки, чтобы разрешить использование ORDER / LIMIT для отдельных запросов:

(SELECT * FROM some tables WHERE ... ORDER BY field1 LIMIT 0, 1)
UNION   
(SELECT * FROM some tables WHERE ...)
ORDER BY 1   /* optional -- applies to the UNIONed result */
LIMIT 0, 100 /* optional -- applies to the UNIONed result */
10 голосов
/ 01 июня 2011
SELECT * FROM (SELECT * FROM some tables WHERE ... ORDER BY field1 LIMIT 0,1) x
UNION ALL
SELECT * FROM some tables WHERE ...

Обратите внимание на использование UNION ALL:

  • UNION удаляет повторяющиеся строки из результирующего набора, и БД заказывает все строк перед выполнением этого (таким образом, весь результирующий набор сортируется)
  • UNION ALL сохраняет порядок и дубликаты
4 голосов
/ 01 июня 2011

просто поместите все в круглые скобки:

(SELECT * FROM table1 ORDER BY datetime  )
UNION   
(SELECT * FROM table2 ORDER BY datetime DESC)
2 голосов
/ 22 ноября 2012
(SELECT user_id AS id FROM tbl_user)
UNION
(SELECT address_id AS id FROM tbl_address)
ORDER BY id ASC LIMIT 10
...