使用union的mysql命令似乎不起作用

Kel*_*ton 16 mysql union select sql-order-by

这是我的查询

(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%") ORDER BY `ups` DESC,`downs` ASC)
UNION
(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only%" OR `joke` LIKE "%only%") ORDER BY `ups` DESC,`downs` ASC)
UNION
(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%three%" OR `joke` LIKE "%three%") ORDER BY `ups` DESC,`downs` ASC)
UNION
(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%doors%" OR `joke` LIKE "%doors%") ORDER BY `ups` DESC,`downs` ASC)
 LIMIT 0, 30
Run Code Online (Sandbox Code Playgroud)

出于某种原因,它似乎没有按顺序排序......它只是按照它们在数据库中自然的顺序将结果扔回去.

当我将其剪切为只有一个查询时,它工作正常,但除此之外,它似乎忽略它.

我也不想按整个结果订购,或者我会放 LIMIT 0,30 Order By blah

Abe*_*ler 24

来自MySQL 文档:

...对单个SELECT语句使用ORDER BY并不意味着行在最终结果中出现的顺序,因为UNION默认生成一组无序行.

基本上,ORDER联盟中唯一有用的时间就是你正在使用LIMIT它.

所以,如果您查询是这样的:

(SELECT * FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%") ORDER BY `ups` DESC,`downs` ASC LIMIT 10)
UNION ...
Run Code Online (Sandbox Code Playgroud)

然后,您将看到将根据该订单返回的前十条记录,但它们不一定按顺序显示.

更新:

试试这个 -

(SELECT *, 1 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%") )
UNION
(SELECT *, 2 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only%" OR `joke` LIKE "%only%") )
UNION
(SELECT *, 3 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%three%" OR `joke` LIKE "%three%") )
UNION
(SELECT *, 4 as ob FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%doors%" OR `joke` LIKE "%doors%"))
 ORDER BY `ob`, `ups` DESC,`downs` ASC LIMIT 0, 30
Run Code Online (Sandbox Code Playgroud)

  • 你对如何让它按照我想要的方式工作有什么想法吗?本质上,我想组合不同的查询,并让每个查询按起伏情况单独排序,然后一个接一个地合并。 (2认同)
  • 这很奇怪。为什么 MySQL 在连接时每个人都想随机排序一个有序列表? (2认同)