2

次のクエリを使用する場合:

SELECT DISTINCT comment FROM table;

そして、たとえば次のデータがあります:(IDは注文を表示するためだけにあります...)

ID | comment
-------------
1  | comment1
2  | comment1
3  | comment2
4  | comment1

私が返すことができたのは、次の3つの結果です。

結果 1:

1  | comment1
3  | comment2

結果 2:

3  | comment2
4  | comment1

結果 3:

order is unpredicatable

質問1:

結果はプラットフォームに依存しませんか? 常に予測可能な結果が得られることを確認できますか?

質問2:

すべてのコメントを個別に選択して NEWEST のみを取得したい、つまり常に結果 2 を取得したい。それを達成することは可能ですか? キーによる順序付けが結果に影響する可能性がありますか?

4

3 に答える 3

2

クエリは ID 列を要求せず、コメント列のみを要求します。

SELECT DISTINCT comment FROM table;

結果には ID が含まれていないため、各値の元の行は関係ありません。

comment1
comment2

それらをどのようにソートするかについては、インデックスの順序に依存すると思います。私は確認するためにテストを行います:

mysql> create table t (id int primary key, comment varchar(100));

mysql> insert into t values
    -> (1, 'comment2'),
    -> (2, 'comment1'),
    -> (3, 'comment2'),
    -> (4, 'comment1');

デフォルトの順序は主キーの順序です。

mysql> select distinct comment from t;
+----------+
| comment  |
+----------+
| comment2 |
| comment1 |
+----------+

一方、要求された列にインデックスがある場合は、インデックス順に値を返します。

mysql> create index i on t(comment);

mysql> select distinct comment from t;
+----------+
| comment  |
+----------+
| comment1 |
| comment2 |
+----------+

誰もが InnoDB を使用する必要があるため、InnoDB ストレージ エンジンを想定しています。;-)


最後の質問は、DISTINCT をまったく含まないクエリが本当に必要であることを示していますが、それは質問です。このタイプの質問は非常に一般的であり、StackOverflow で何百回も尋ねられ、回答されています。リンクをたどって、多くの解決策を読んでください。

于 2013-10-15T14:38:10.867 に答える
1

どの一意の行が返されるか、どの順序で返されるかを実験して確認できますが、現在のデータベース エンジン バージョンの下で、今日の実験テーブルでどのようになるかを示すだけです。 . 結論:

  • それがあなたSELECT DISTINCT commentの中idにないので、あなたが重要ではない場合SELECT
  • そうしないORDER BYと、データベースが順序を決定します。

ID付きの最新の個別のコメントが必要な場合、これは毎回機能します(完全な開示:これは機能するが問題を考えすぎていた以前の回答を置き換えます):

SELECT comment, MAX(id)
FROM myTable
GROUP BY comment
ORDER BY 2 DESC;

ORDER BY 2 DESCは、ID が大きいほど、コメントが新しいと見なすことに注意してください。

于 2013-10-15T14:52:16.517 に答える
0

単一の個別の列を選択すると、他の列は返されません。

select distinct column from table

と同じ結果です

select column from table group by column

どちらの場合も、列の並べ替え順序は予測できません。実行計画は、大量のデータ、さまざまなテーブル構造、さまざまなデータベース バージョンによって異なる可能性があります。

あなたの結果を模倣するには、次のことを行う必要があります。

select id, column from table group by column

これは違法なグループ化です。SQL モードで実行が許可されている場合、ID はランダムになります。

つまりselect distinct * from table、すべての個別の行が返されます。あなたの場合はすべてのテーブルです。

于 2013-10-15T14:38:12.217 に答える