在ORDER BY和LIMIT之后使用UNION

26

我的目标是执行两个不同的查询,然后将它们合并。
我的代码是:

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

我遇到了以下错误:

#1221 - UNION 和 ORDER BY 的使用不正确

很重要的一点是,ORDER BY 只能用于第一个查询。我该如何执行此任务?


1
阅读此教程 - luca
4个回答

39

您可以使用括号来允许在单个查询上使用 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 */

2
语法错误... 您需要从已赋别名的(加括号的)select中进行选择。 - Bohemian
嗯,我也检查了并且得到了错误。也许我需要升级我的mysql。抱歉! - Bohemian
它对我没用 http://www.codeproject.com/Questions/1004382/maintain-order-of-two-queries-after-union - Mohammad Faizan khan

11
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
只需要把所有内容放在圆括号里:
(SELECT * FROM table1 ORDER BY datetime  )
UNION   
(SELECT * FROM table2 ORDER BY datetime DESC)

1
语法错误...您需要从别名(括号内)选择。 - Bohemian
我检查了并得到了错误。也许我需要升级我的mysql。抱歉! - Bohemian

2
(SELECT user_id AS id FROM tbl_user)
UNION
(SELECT address_id AS id FROM tbl_address)
ORDER BY id ASC LIMIT 10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接