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

时间:2015-01-08 11:12:55

标签: mysql

我设法偶然发现了以前没有注意到的奇怪的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的类型,那么两个查询结果的顺序保持不变。

2 个答案:

答案 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是唯一的   本身)。因此,你会得到不同的结果。