私は、同じデータを持つ複数の行を持つテーブルを持っています。私は一意の行を取得するためにSELECT DISTINCT
を使用し、それは正常に動作します。しかし、私がORDER BY
をSELECT DISTINCT
と使用すると、それは私にソートされていないデータを与えます。MySQLでSELECT DISTINCTはどのように機能しますか?
どのように明確に機能するか教えていただけますか?
どの基準に基づいて行が選択されていますか?
私は、同じデータを持つ複数の行を持つテーブルを持っています。私は一意の行を取得するためにSELECT DISTINCT
を使用し、それは正常に動作します。しかし、私がORDER BY
をSELECT DISTINCT
と使用すると、それは私にソートされていないデータを与えます。MySQLでSELECT DISTINCTはどのように機能しますか?
どのように明確に機能するか教えていただけますか?
どの基準に基づいて行が選択されていますか?
SELECT DISTINCT
と指定すると、すべての行が表示され、結果セットから重複が除外されます。 "duplicates"とは、すべてのフィールドが同じ値を持つ行を意味します。
num
-----
1
3
なお、行の実際の行(例:かどうか
id | num
--------------
1 | 1
2 | 3
3 | 3
SELECT DISTINCT *
は、2つの行を返しますSELECT DISTINCT num
のに対し、上記のすべての行を返します:たとえば、あなたは次のようになり、テーブルを持っていると言いますそれは2行目または3行目です)、それは結果が分かりにくいので無関係です。
最後に、DISTINCT
はではなく、はORDER BY
の動作に影響します。
それはMYSQLのように見えます。これを読んでください:http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html – Icarus
これはバグのようなものです:) – Randy
@Icarus結果のセットが行われている限り、それが実行する最適化は無関係ですあなたが期待している方法に戻ります。 – NullUserException
以前のコメントから、私が予想したように、あなたが実行しようとしているクエリは
Select distinct id from table where id2 =12312 order by time desc.
あり、ここに問題があります。選択列と列順は異なります。出力行は時間順に並べられますが、その順序は必ずしもid列に保持する必要はありません。ここに例があります。
id | id2 | time
-------------------
1 | 12312 | 34
2 | 12312 | 12
3 | 12312 | 48
あなたは
SELECT * FROM table WHERE id2=12312 ORDER BY time DESC
を実行する場合は、あなたがこれからのみidカラムを選択した場合さて、あなたは
id
--
2
1
3
を取得する次のような結果
id | id2 | time
-------------------
2 | 12312 | 12
1 | 12312 | 34
3 | 12312 | 48
を取得します
あなたの結果はソートされていません。
複数のID(例:id = 2とid = 1が複数回出現した場合) – insomiac
"id2 = 12312 order by time desc"のテーブルから一意のIDを選択すると、重複は削除されます。 「id2 = 12312 order by order desc」のテーブルからIDを選択すると、結果に重複が含まれます。したがって、idのすべての出現が返されます。 – srivani
返信してくれてありがとう、たとえば、最近のIDを時間単位で取得したい場合や、別のIDで時間をかけてdescを行っている場合などです。それはmysqlで動作しません。あなたは注文とどのように異なった作品を知っていますか? – insomiac
ORDER BY
の式がSELECT
句に存在しないと、記述する動作が発生します。 SQL標準ではこのようなクエリは許可されていませんが、MySQLではあまり厳密ではありません。のは、テーブルtable1
の内容があるとしましょう
SELECT DISTINCT colum1, column2
FROM table1
WHERE ...
ORDER BY column3
:
のは、例を試してみましょうORDER BY
句なし
id | column1 | column2 | column3
----+---------+---------+---------
1 | A | B | 1
2 | A | B | 5
3 | X | Y | 3
、ORDER BY
順序なしの二つのレコード(以下上記のクエリが返します保証対象外):
column1 | column2
---------+---------
A | B
X | Y
しかし、ORDER BY column3
との順序も保証されていません。
DISTINCT
句は、SELECT
句にある式の値に作用します。行#1が最初に処理された場合、(A
、B
)が結果セットに配置され、行#1に関連付けられます。次に、行番号2が処理されると、SELECT
式の値によって、結果セット内にすでに存在するレコード(A
、B
)が生成されます。 DISTINCT
のため、削除されます。行番号3は、結果セットにも入れられる(X
,Y
)を生成します。次に、ORDER BY column3
句を使用すると、レコードは(A
、B
)、(X
、Y
)のように結果セットにソートされます。行#2は、行番号1の前に処理される場合
しかし、前の段落で露出同じロジックに従う、結果セット内のレコードは(X
、Y
)、(A
、B
)として分類されます。
データベースエンジンには、クエリの実行時に行を処理する順序についての規則はありません。データベースは、パフォーマンスを考慮して、任意の順序で行を自由に処理できます。
あなたのクエリは無効なSQLであり、同じ入力データを使用して異なる結果を返すことができます。
実行しようとしているクエリは何ですか? – srivani
@srivani:id2 = 12312 order by time descのテーブルからdistinct idを選択します。 – insomiac
私はそれが遅すぎることを知っていますが、Acceptedの回答はまだありませんので、OPが依然として答えに含まれていないものについて答えを求めているかどうかを知りたいのですが? –