2011-09-16 32 views
5

私は、同じデータを持つ複数の行を持つテーブルを持っています。私は一意の行を取得するためにSELECT DISTINCTを使用し、それは正常に動作します。しかし、私がORDER BYSELECT DISTINCTと使用すると、それは私にソートされていないデータを与えます。MySQLでSELECT DISTINCTはどのように機能しますか?

どのように明確に機能するか教えていただけますか?

どの基準に基づいて行が選択されていますか?

+0

実行しようとしているクエリは何ですか? – srivani

+0

@srivani:id2 = 12312 order by time descのテーブルからdistinct idを選択します。 – insomiac

+0

私はそれが遅すぎることを知っていますが、Acceptedの回答はまだありませんので、OPが依然として答えに含まれていないものについて答えを求めているかどうかを知りたいのですが? –

答えて

1

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 SELECT statement

+2

それはMYSQLのように見えます。これを読んでください:http://dev.mysql.com/doc/refman/5.0/en/distinct-optimization.html – Icarus

+0

これはバグのようなものです:) – Randy

+0

@Icarus結果のセットが行われている限り、それが実行する最適化は無関係ですあなたが期待している方法に戻ります。 – NullUserException

2

以前のコメントから、私が予想したように、あなたが実行しようとしているクエリは

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 

を取得します

あなたの結果はソートされていません。

+0

複数のID(例:id = 2とid = 1が複数回出現した場合) – insomiac

+0

"id2 = 12312 order by time desc"のテーブルから一意のIDを選択すると、重複は削除されます。 「id2 = 12312 order by order desc」のテーブルからIDを選択すると、結果に重複が含まれます。したがって、idのすべての出現が返されます。 – srivani

+0

返信してくれてありがとう、たとえば、最近のIDを時間単位で取得したい場合や、別のIDで時間をかけてdescを行っている場合などです。それはmysqlで動作しません。あなたは注文とどのように異なった作品を知っていますか? – insomiac

0

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が最初に処理された場合、(AB)が結果セットに配置され、行#1に関連付けられます。次に、行番号2が処理されると、SELECT式の値によって、結果セット内にすでに存在するレコード(AB)が生成されます。 DISTINCTのため、削除されます。行番号3は、結果セットにも入れられる(X,Y)を生成します。次に、ORDER BY column3句を使用すると、レコードは(AB)、(XY)のように結果セットにソートされます。行#2は、行番号1の前に処理される場合

しかし、前の段落で露出同じロジックに従う、結果セット内のレコードは(XY)、(AB)として分類されます。

データベースエンジンには、クエリの実行時に行を処理する順序についての規則はありません。データベースは、パフォーマンスを考慮して、任意の順序で行を自由に処理できます。

あなたのクエリは無効なSQLであり、同じ入力データを使用して異なる結果を返すことができます。

関連する問題