列の値ごとにSELECT LIMIT 1?


10

次の表があるとしましょう

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 2         | awesome       |
| 3         | i hate this   |
| 3         | okay          |
| 6         | this is weird |
| 6         | hello?        |
| 6         | what is it    |
| 9         | how are you   |
| 16        | too slow      |
| 16        | yes           |
| 17        | alrighty      |
-----------------------------

どのようにして1行を選択できますuser_idか?だから私の結果は:

-----------------------------
| user_id   | comment       |
-----------------------------
| 2         | thats cool    |
| 3         | i hate this   |
| 6         | this is weird |
| 9         | how are you   |
| 16        | too slow      |
| 17        | alrighty      |
-----------------------------

これは単一の効率的なクエリで可能ですか?またはサブ選択が必要ですか?どういうわけDISTINCTか単一の列で使用することは可能ですか?

回答:


9

それGROUP BYが使われているのです。(グループごとに)1行を取得します。この場合、すべての個別のuser_id値が表示され、残りの列については、、、、などの集計関数を使用する必要があります(必須)MIN()。これMAX()AVG()SUM()グループごとに複数の値があり、1つしか表示できないためです。

SELECT
    user_id
  , MIN(comment) AS comment  -- it will show the first in alphabetical order  
                             -- you could also use MAX()
FROM
    tableX
GROUP BY
    user_id ;

MySQLは、ユーザーごとに1つの(多かれ少なかれランダムな)コメントを返す、次の非正統的なソリューションも許可します。

SELECT
    user_id
  , comment
FROM
    tableX
GROUP BY
    user_id ;

この最後のクエリは機能しませんが、(より厳密な)ONLY_FULL_GROUP_BYモードが有効になっている場合はエラーが発生します。最近リリースされた5.7バージョンでは、このモードがデフォルトであり、新しい関数ANY_VALUE()が提供されています。詳細については、MySQLの処理GROUP BYページを参照してください。クエリは今書くことができます:

SELECT
    user_id
  , ANY_VALUE(comment) AS comment
FROM
    tableX
GROUP BY
    user_id ;

「非正統派」バージョンまたは最近のANY_VALUE()関数を使用して、SELECTリストに列を追加した場合、それらの値が同じ行からのものであるとは限らず、同じグループ内の行からのものであることに注意してください。それらが選択される方法は正確にランダムではなく、実行プランと使用されるインデックスに依存します。


user_idに対してプルされる行を指定する他の方法はありますか?ORDER BYの種類を指定する方法はありますか?
ジェイクウィルソン

ほかにMINMAX
ypercubeᵀᴹ

1
次に、それはより複雑です。この他の質問を参照してください:MySQLクエリ-最新の人口統計を取得する方法?
ypercubeᵀᴹ

2
[greatest-n-per-group]タグの下にあるSOサイトにも同様の問題がたくさんあります。
ypercubeᵀᴹ

1
@ T.BrianJonesは、SELECTリストに他のすべての列を追加すると、「unorthodox」クエリで意味しますか?それは最初のものであり、同じ行からのものではない可能性があります。正確にランダムではありませんが、値は異なる行(同じグループ)から取得できます。
ypercubeᵀᴹ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.