为什么在MYSQL中使用GROUP BY时DISTINCT会显示不同的结果

时间:2012-09-27 19:51:49

标签: mysql group-by distinct

我有以下两个问题:

SELECT id, sex FROM user WHERE sex=0 GROUP BY id LIMIT 10;使用以下输出:

+----+-----+
| id | sex |
+----+-----+
|  3 |   0 |
|  6 |   0 |
| 30 |   0 |
| 36 |   0 |
| 38 |   0 |
| 40 |   0 |
| 43 |   0 |
| 46 |   0 |
| 48 |   0 |
| 54 |   0 |
+----+-----+
10 rows in set (0.04 sec)

SELECT DISTINCT id, sex FROM user WHERE sex=0 LIMIT 10;

+------+-----+
| id   | sex |
+------+-----+
|  721 |   0 |
|  440 |   0 |
|  485 |   0 |
| 2388 |   0 |
| 1215 |   0 |
| 1218 |   0 |
| 6569 |   0 |
| 5123 |   0 |
| 5178 |   0 |
| 5177 |   0 |
+------+-----+
10 rows in set (0.03 sec)

但他们表现出不同的结果。是什么让他们产生不同的结果。一切都完成后,我的印象是LIMIT被应用了。可能LIMIT会影响这一点,或者在尝试查找唯一/不同值时,DISTINCT和GROUP BY的行为会有所不同。他们在输出结果之前是否订购了它们?

2 个答案:

答案 0 :(得分:1)

因为你的查询不确定。 如果您没有通过向查询添加订单,mysql会选择以最快的方式访问的数据。如果你改变你的查询,mysql可以改变他的执行计划,因此将确定其他行以便最快地访问。

如果你想要一个确定性的(每次它应该返回相同的)结果,添加一个order by,按正确的顺序命令所有业务键(或主键)列

这将是确定性的:

SELECT DISTINCT id, sex 
FROM user 
WHERE sex=0 
order by id
LIMIT 10

编辑: 这是因为GROUP BY意味着'order by',而不是,因为group by必须在临时表中“分组”,所以它可以聚合,同时distinct会忽略重复值

答案 1 :(得分:1)

因为您没有使用ORDER BY子句。如果你使用ORDER BY clausweree,它会对结果集进行排序,在两种情况下都应返回相同的结果