6

MySQL クエリで、DISTINCTオプションを使用する場合、ORDER BY重複が削除された後に適用されますか? そうでない場合、そうする方法はありますか?私のコードでいくつかの問題が発生していると思います。

編集:
ここに、私の問題の原因に関する詳細情報があります。一見すると、重複する行を扱っているため、この順序は重要ではないことを理解しています。INNER JOINただし、行をソートするために を使用しているため、これは完全に当​​てはまるわけではありません。

このデータを含むフォーラム スレッドのテーブルがあるとします。

+----+--------+-------------+
| id | userid |    title    |
+----+--------+-------------+
|  1 |      1 | Information |
|  2 |      1 | FAQ         |
|  3 |      2 | Support     |
+----+--------+-------------+

次のような別のテーブルにも一連の投稿があります。

+----+----------+--------+---------+
| id | threadid | userid | content |
+----+----------+--------+---------+
|  1 |        1 |      1 | Lorem   |
|  2 |        1 |      2 | Ipsum   |
|  3 |        2 |      2 | Test    |
|  4 |        3 |      1 | Foo     |
|  5 |        2 |      3 | Bar     |
|  6 |        3 |      5 | Bob     |
|  7 |        1 |      2 | Joe     |
+----+----------+--------+---------+

次の MySQL クエリを使用してすべてのスレッドを取得し、最新の投稿に基づいて並べ替えています (ID が大きいほど最近の投稿であると仮定します)。

SELECT t.*
FROM Threads t
INNER JOIN Posts p ON t.id = p.threadid
ORDER BY p.id DESC

これは機能し、次のようなものが生成されます。

+----+--------+-------------+
| id | userid |    title    |
+----+--------+-------------+
|  1 |      1 | Information |
|  3 |      2 | Support     |
|  2 |      1 | FAQ         |
|  3 |      2 | Support     |
|  2 |      1 | FAQ         |
|  1 |      1 | Information |
|  1 |      1 | Information |
+----+--------+-------------+

ただし、ご覧のとおり、情報は正しいのですが、重複する行があります。そのような重複を削除したいので、SELECT DISTINCT代わりに使用しました。ただし、これにより次の結果が得られました。

+----+--------+-------------+
| id | userid |    title    |
+----+--------+-------------+
|  3 |      2 | Support     |
|  2 |      1 | FAQ         |
|  1 |      1 | Information |
+----+--------+-------------+

「情報」スレッドが一番上にあるはずなので、これは明らかに間違っています。を使用するDISTINCTと、重複が上から下に削除されるように思われるため、最後の行のみが残ります。これにより、並べ替えでいくつかの問題が発生します。

これは事実ですか、それとも物事を間違って分析していますか?

4

3 に答える 3

5

理解しておくべき 2 つのこと:

  1. 一般に、節を指定しない限り、結果セットは順不同です。非厳密な順序(つまり、一意でない列)ORDER BYを指定する限り、その順序で等しいレコードが結果セット内に表示される順序は未定義です。ORDER BY

    問題の根源であるそのような非厳密な順序を指定している可能性があると思います。ORDER BY最終的な位置を気にする各レコードを一意に識別するのに十分な一連の列を指定することにより、順序付けが厳密であることを確認してください結果セットで。

  2. DISTINCTを使用するGROUP BYと、グループ化された列によって結果が並べ替えられます。つまり、適用さSELECT DISTINCT a, b, c FROM tれたかのように見える結果セットが生成ORDER BY a, b, cされます。繰り返しますが、ニーズを満たすために十分に厳密な順序を指定すると、この効果がオーバーライドされます。


更新後、上記のポイント 2 を念頭に置いて、達成DISTINCTする結果をグループ化する効果により、グループ化されていない列で並べ替えることが不可能になることは明らかp.idです。代わりに、次のことが必要です。

SELECT   t.*
FROM     Threads t INNER JOIN Posts p ON t.id = p.threadid
GROUP BY t.id
ORDER BY MAX(p.id) DESC
于 2012-06-05T21:51:22.467 に答える
1

DISTINCT行セットを作成する方法を MySQL に通知し、ORDER BYこの行セットがどのように表示されるかのヒントを提供します。答えはDISTINCT、最初、ORDER BY最後です。

于 2012-06-05T21:12:55.113 に答える
1

DISTINCTとが適用される順序はORDER BY、ほとんどの場合、最終的な出力には影響しません。

ただし、 も使用するとGROUP BY、最終的な出力に影響します。この場合、は のORDER BYに実行され、予期しない結果が返されます (グループ化の前に並べ替えが実行されると想定していると仮定します)。GROUP BY

于 2012-06-05T21:28:52.207 に答える