mysql order by with union似乎不起作用

mysql order by with union似乎不起作用,mysql,select,sql-order-by,union,Mysql,Select,Sql Order By,Union,这是我的问题 (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` LIK

这是我的问题

(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
出于某种原因,它似乎并不是按上升或下降的顺序排列的……它只是按照结果在数据库中的自然顺序将结果返回给我

当我把它简化为一个查询时,它工作得很好,但除此之外,它似乎忽略了它

我也不想按整个结果排序,否则我会将0,30个顺序限制在MySQL中:

。。。对单个SELECT语句使用ORDER BY意味着 与行在最终结果中的显示顺序无关 因为默认情况下,UNION生成一组无序的行

基本上,工会中的订单唯一有用的时候就是你也在使用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 ...
然后您将看到根据该顺序返回的前十条记录,但它们不一定按顺序显示

更新:

试试这个-

(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

查询所做的是分别对每个子查询进行排序,并统一所有子查询。不能保证结果会被公布

您需要做的是对统一查询进行如下排序:

Select * from (
  (SELECT *, 1 as `p` FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only three doors%" OR `joke` LIKE "%only three doors%"))
  UNION
  (SELECT *, 2 as `p` FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%only%" OR `joke` LIKE "%only%"))
  UNION
   (SELECT *, 3 as `p` FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%three%" OR `joke` LIKE  "%three%"))
  UNION
  (SELECT *, 4 as `p` FROM `jokes` WHERE `flags` < 5 AND (`title` LIKE "%doors%" OR `joke` LIKE "%doors%"))
    ) ORDER BY `p` ASC, `ups` DESC,`downs` ASC

您应该能够使用UNION ALL删除重复的删除,并完成结果集排序。使用该选项,结果集应按照查询中select语句的顺序排列。

我得到了以下解决方案:

SELECT *
FROM (
    (SELECT 1 as SortRank, uid, title, state, zip, region,cantone FROM company WHERE city=".$city." AND region=".$region." AND cantone=".$cantone.")
     UNION
    (SELECT 2 as SortRank, uid, title, state, zip, region,cantone FROM company WHERE region=".$region." AND cantone=".$cantone.")
    union all
    (SELECT 3 as SortRank, uid, title, state, zip, region,cantone FROM company WHERE cantone=".$cantone.")
) As u
GROUP BY uid 
ORDER BY SortRank,state=2, title ASC
LIMIT 0,10
在上面的查询中,我希望得到结果,例如:首先显示城市、地区和州的所有记录,然后如果城市不可用,则显示区域和州的所有记录,然后显示城市的州的所有记录。
因此,删除我使用的GROUP BY子句中的重复记录,它将根据查询组对所有记录进行排序,然后对状态为2的所有记录进行排序。

您对如何使其按我希望的方式工作有什么想法吗?基本上,我想要组合不同的查询,并让每个查询按照它们的升降顺序进行单独排序,然后一个接一个地组合。因此,第一个查询排序,然后第二个查询排序。如果第一个大于30,那么它只会在第一个查询中显示前30个。你是说你不想对整个集合进行正确排序?只需将一个排序集附加到另一个排序集的末尾,然后取前30个?这是正确的。有分页,所以当有人进入下一页时,我会限制30,60等。这很奇怪。为什么MySQL会在连接时随机排序一个有序的列表?我已经考虑过了,但正如我前面提到的,这不是我想要的结果。第一个查询的所有结果都应该在第二个查询的任何结果之前。我编辑了该查询以满足您的需要,添加了一个附加字段“p”,我会将其提供给您,但另一个人首先得到了正确的解决方案。谢谢这个查询的另一件事,在Select*FROM中围绕整个查询实际上不返回任何结果,所以用UNION ALL替换UNION?试试看,看是否有帮助,如果没有,我浪费了你不超过20秒的时间:。。我手头没有一个本地mysql来测试它,但它应该会有所不同等等,我不想要重复的。然后继续添加额外的列进行排序,就像已经接受的答案一样。谢谢!我花了几个小时试图解决这个问题。不能保证按uid分组返回特定的行。您依赖于未记录的行为,它返回它出现的第一个行为。也就是说,如果uid同时出现在SortRank 1和SortRank 2中,则无法保证它在group by之后仍然具有SortRank 1。