我设法偶然发现了以前没有注意到的奇怪的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错误?我注意到如果我更改VARCHAR(255)而不是TEXT的字段c的类型,那么两个查询结果的顺序保持不变。
答案 0 :(得分:1)
没有错误。问题是MySQL中的排序(以及一般的SQL)并不稳定。也就是说,order by
具有相同键值的行可以按任何顺序出现。
order by keys
的行具有完全相同的值,例如:
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
答案 1 :(得分:0)
没有错误,你要添加包含空值的c列, 甚至null也无法与null进行比较(或者NULL是唯一的 本身)。因此,你会得到不同的结果。