我有以下两个问题:
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的行为会有所不同。他们在输出结果之前是否订购了它们?
答案 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,它会对结果集进行排序,在两种情况下都应返回相同的结果