mysql distinct 查询疑问
迷茫
迷茫 2017-04-17 14:55:56
0
2
632

需求

想知道最近N条记录中某一字段取值有哪几种

select * from t;
+----+------+
| id | a    |
+----+------+
|  1 | aaa  |
|  2 | aaa  |
|  3 | bbb  |
|  4 | bbb  |
|  5 | ccc  |
|  6 | ddd  |
|  7 | ddd  |
|  8 | foo  |
|  9 | bar  |
+----+------+
# 想知道最早4条记录中 a取值有哪几种 期望是aaa bbb 但实际不满足期望
select distinct a  from t order by id limit 4;
+------+
| a    |
+------+
| aaa  |
| bbb  |
| ccc  |
| ddd  |
+------+
#必须使用这种写法
select distinct a  from (select a from t order by id limit 4) a;
+------+
| a    |
+------+
| aaa  |
| bbb  |
+------+

为什么第一种写法不行? 似乎是先将所有a的取值都查出来再截取4个,但此时没有id啊,只有a啊。Mysql又是怎样处理order by id的呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全員に返信(2)
Ty80

これは SQL の実行順序によって決まります。
記述順序: select... from... where.... group by... getting... order by... limit [offset , ] (行)
実行順序: from... where...group by... getting.... select... order by... limit
出てもいい、limitが最後
SQL を見ると、実際には最初にすべての Different(a) が見つかり、次に 4 つに制限されます (4 つの個別の a)。

いいねを押す +0
大家讲道理

最初に説明一下

mysql> select * from t order by id 制限 4 を説明します。
+-----+-------------+----------+----------+-------------- -+----------+-----------+----------+------+----------+
| ID |選択タイプ |テーブル |タイプ |可能なキー |キー |キー長 |参照 |行 |番外編 |
+-----+-------------+----------+----------+-------------- -+----------+-----------+----------+------+----------+
|  1 |シンプル | t |インデックス | NULL |プライマリ | 4 | NULL |    4 | NULL |
+-----+-------------+----------+----------+-------------- -+----------+-----------+----------+------+----------+

その後、distinct を追加します

mysql> t から異なる a を選択して、id 制限 4 で並べ替える説明をします。
+-----+-------------+----------+----------+-------------- -+----------+----------+-----+-----+-------------- ---+
| ID |選択タイプ |テーブル |タイプ |可能なキー |キー |キー長 |参照 |行 |番外編 |
+-----+-------------+----------+----------+-------------- -+----------+----------+-----+-----+-------------- ---+
|  1 |シンプル | t |インデックス | NULL |プライマリ | 4 | NULL |    4 |一時的な | の使用
+-----+-------------+----------+----------+-------------- -+----------+----------+-----+-----+-------------- ---+
セット内の 1 行 (0.00 秒)

セクションは Extra です。一時的なものを使用し、中間結果を一時的に保存します。

したがって、実行結果は、収集された時間テーブルから個別の a を選択し、その後、場所、順序によってデータを再び時間テーブルから取得することになります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート