gpt4 book ai didi

mysql - 选择文本字段时奇怪的 MySQL 排序行为

转载 作者:行者123 更新时间:2023-11-29 02:58:11 27 4
gpt4 key购买 nike

我设法偶然发现了我以前没有注意到的奇怪的 mysql 行为。

MySQL服务器版本:5.5.38

CREATE TABLE IF NOT EXISTS `testing` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`c` text,
`d` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `testing` (`id`, `a`, `b`, `c`, `d`) VALUES
(1, 1, 11, NULL, '2015-01-08 08:26:00'),
(2, 2, 22, NULL, '2015-01-08 18:35:00'),
(3, 4, 44, NULL, '2015-01-08 12:17:00'),
(4, 5, 44, NULL, '2015-01-08 12:53:00'),
(5, 5, 44, NULL, '2015-01-08 08:26:00'),
(6, 5, 44, NULL, '2015-01-08 08:26:00'),
(7, 5, 44, NULL, '2015-01-08 08:26:00'),
(8, 5, 44, NULL, '2015-01-08 09:37:00'),
(9, 5, 22, NULL, '2015-01-08 08:26:00'),
(10, 5, 33, NULL, '2015-01-08 08:26:00'),
(11, 5, 44, NULL, '2015-01-08 08:40:00'),
(12, 5, 32, NULL, '2015-01-08 08:26:00');

查询

SELECT id, IF( a =5
AND b =44, 0, 1 ) AS active, d
FROM `testing`
ORDER BY active, d DESC

返回

id  active  d
4 0 2015-01-08 12:53:00
8 0 2015-01-08 09:37:00
11 0 2015-01-08 08:40:00
7 0 2015-01-08 08:26:00
5 0 2015-01-08 08:26:00
6 0 2015-01-08 08:26:00
2 1 2015-01-08 18:35:00
3 1 2015-01-08 12:17:00
10 1 2015-01-08 08:26:00
9 1 2015-01-08 08:26:00
1 1 2015-01-08 08:26:00
12 1 2015-01-08 08:26:00

但是查询

SELECT id, IF( a =5
AND b =44, 0, 1 ) AS active, d, c
FROM `testing`
ORDER BY active, d DESC

返回

id  active  d                       c
4 0 2015-01-08 12:53:00 NULL
8 0 2015-01-08 09:37:00 NULL
11 0 2015-01-08 08:40:00 NULL
5 0 2015-01-08 08:26:00 NULL
6 0 2015-01-08 08:26:00 NULL
7 0 2015-01-08 08:26:00 NULL
2 1 2015-01-08 18:35:00 NULL
3 1 2015-01-08 12:17:00 NULL
1 1 2015-01-08 08:26:00 NULL
9 1 2015-01-08 08:26:00 NULL
10 1 2015-01-08 08:26:00 NULL
12 1 2015-01-08 08:26:00 NULL

如何通过选择附加字段来改变sql查询结果的顺序?是否有任何原因会发生这种情况,或者这是一个 mysql 错误?我注意到,如果我将字段 c 的类型更改为 VARCHAR(255) 而不是 TEXT,那么两个查询结果的顺序将保持不变。

最佳答案

没有错误。问题是 MySQL(和一般的 SQL)中的排序不稳定。也就是说,对于 order by 具有相同键值的行可以以任何顺序出现。

您有一些行的键排序值完全相同,例如:

1   1       2015-01-08 08:26:00     NULL
9 1 2015-01-08 08:26:00 NULL
10 1 2015-01-08 08:26:00 NULL
12 1 2015-01-08 08:26:00 NULL

(第二和第三列是 order by 键。)

当您对数据进行排序时,这些数据可以以任何顺序出现——有或没有额外的列。对于稳定的排序,您应该始终包含标识列:

ORDER BY active, d DESC, id

关于mysql - 选择文本字段时奇怪的 MySQL 排序行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27838739/

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