1

次の2つのクエリがあります。

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とGROUPBYの動作が異なる可能性があります。結果を出力する前に注文しますか?

4

2 に答える 2

1

クエリは決定論的ではないためです。クエリに順序を追加しない場合、mysqlは最も高速にアクセスされるデータを選択します。クエリを変更すると、mysqlは実行プランを変更できるため、他の行が最速のアクセスのために決定されます。

決定論的な(同じものを返す必要があるたびに)結果が必要な場合は、すべてのビジネスキー(または主キー)列を適切な順序で並べ替える順序を追加します

これは決定論的です:

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

編集:これは、GROUPBYが'order by'を意味するためであり、distinctではなく、group byが一時テーブルで「グループ化」する必要があるため、集約できますが、distinctは重複する値を無視します

于 2012-09-27T19:56:49.113 に答える
1

ORDERBY句を使用していないためです。ORDER BY clauswereeを使用すると、結果セットが並べ替えられ、どちらの場合も同じ結果が返されます。

于 2012-09-27T20:00:04.223 に答える