1

我有以下两个查询:

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 的行为是否不同。他们在输出结果之前订购它们吗?

4

2 回答 2

1

因为您的查询不是确定性的。如果您没有在查询中添加order by,mysql 会选择以最快方式访问的数据。如果你改变你的查询,mysql可以改变他的执行计划,所以其他行将被确定为最快的访问。

如果您想要一个确定性(每次它应该返回相同的)结果,请添加一个 order by,以正确的顺序对所有业务键(或主键)列进行排序

这将是确定性的:

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

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

于 2012-09-27T19:56:49.113 回答
1

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

于 2012-09-27T20:00:04.223 回答