gpt4 book ai didi

MySQL 联合排序在不同的服务器上意外工作

转载 作者:搜寻专家 更新时间:2023-10-30 22:31:08 24 4
gpt4 key购买 nike

你好,

我对“简单”查询有疑问。当我在不同的服务器上执行它时,我得到了我需要的其他结果集..

我尝试通过 export->import 重新导入所有“表”,但仍然无法正常工作。

哪里会出问题? MariaDB 可能有问题吗?

数据库版本:

  • 5.6.27 - MySQL 社区服务器 (GPL),客户端:libmysql 5.0.11-dev
  • 10.0.25-MariaDB-0+deb8u1 - (Debian),客户端:libmysql 5.5.49

两者都在 MyISAM 引擎上运行。

查询:

SELECT id, datum, ordinary FROM (SELECT *, 0 as `ordinary` FROM 
`user_todolist` WHERE `done` = '0'
AND `deleted` = '0' AND `id_uzivatel` = '1' ORDER BY `datum` ASC) AS a1
UNION
SELECT id, datum, ordinary FROM (SELECT *, 1 as `ordinary` FROM
`user_todolist` WHERE `done` = '1' AND `deleted` = '0' AND
`id_uzivatel` = '1' ORDER BY `datum` DESC) AS a2
ORDER BY `ordinary`

结果(左边为预期,右边为无效):

enter image description here

SQL Explain(Top for Expected,Bot Invalid)

enter image description here

最佳答案

ORDER BY 不一定是稳定排序。当您将 ORDER BY 应用于 UNION 的结果时,它可以在组内重新排序。

您不需要在外部查询中使用 ORDER BY ordinary。当你使用UNION时,结果通常是按照子查询的顺序,所以第一个SELECT的结果会在前,第二个SELECT 之后。

不过,您应该将 UNION 更改为 UNION ALL。默认情况下,它是 UNION DISTINCT,这意味着它必须合并查询结果以删除重复项。由于查询之间永远不会有重复项(因为它们有不同的 ordinary 列),这是不必要的。

另一个不依赖于此的解决方案(我实际上不确定它是否得到保证)是从子查询中取出 ORDER BY datum,并使主查询使用:

ORDER by ordinary, IF(ordinary = 0, datum, '') ASC, IF(ordinary = 1, datum, '') DESC

关于MySQL 联合排序在不同的服务器上意外工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42916203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com