sql >> データベース >  >> RDS >> Mysql

ユーザーごとに1つのコメントだけの最後のコメントを表示する

    GROUP BYで機能しない理由

    SELECT * GROUP BYでは使用できません;無効なSQLです。 GROUP BY テーブルの行を選択しません。提供された式を使用して行のグループを作成し、各グループから新しいレコードを生成し、式に含まれる値を使用してこの新しいレコードの各列を計算します。

    SELECTに表示される列 句は、次のいずれかのルールを満たす必要があります。

    • GROUP BYにも表示されます 条項;
    • GROUP BY 集計関数 ;
    • GROUP BYに表示される列に機能的に依存します 条項。

    * は、クエリで使用されるテーブルのすべての列名のショートカットです。クエリの場合は、userのみです。 列は上記の要件の1つを満たしています。

    バージョン5.7.5より前 MySQLは上記の3番目のルールを実装していません。 SELECTに含まれるクエリを受け入れるために使用されていました GROUP BYのいずれにも従わない句の列 要件。このような列のクエリによって返される値は、不確定でした。

    バージョン5.7.5以降、MySQLはGROUP BYを拒否します 要件を満たしているクエリ。

    ソリューション

    いずれにせよ、問題の解決策にはGROUP BYは含まれません。 。 LEFT JOINを使用して簡単に実行できます 正しい条件で:

    SELECT lc.*
    FROM comments lc               # 'lc' from 'last comment'
        LEFT JOIN comments nc      # 'nc' from 'newer comment'
            ON lc.user = nc.user   # both comments belong to the same user
            AND lc.id < nc.id      # 'nc' is newer than 'lc'
    WHERE nc.id IS NULL            # there is no 'newer comment'
    ORDER BY lc.id DESC
    LIMIT 10
    

    仕組み

    テーブルに参加しますcomments 、別名lc (ユーザーの「最後のコメント」からの「lc」)それ自体に対して、別名nc (「新しいコメント」からの「nc」)。 join句は、lcの各エントリと一致します ncのすべてのエントリ 同じユーザーに属するもの(lc.user = nc.user )および新しい(lc.id < nc.id; IDは順番に割り当てられ、新しいコメントのidの値は大きいと想定しました。 。

    LEFT JOINの使用 lcのすべての行が ncに一致する行が見つからない場合でも、結合の結果にが表示されます (同じユーザーの新しいコメントがないため)。この場合、NULL ncのフィールドの代わりに使用されます 。 WHERE 句は、NULLを持つ行のみを最終結果セットに保持します nc.id内;これは、lcで意味します 一部には、各ユーザーの最新のコメントが含まれています。

    SELECT 句には、lcのすべてのフィールドが含まれます (ncのもの すべてNULLです 、 とりあえず)。 ORDER BY 句を使用して、結果セットを並べ替えることができます。 ORDER BY lc.id DESC 最新のコメントを最初に配置し、LIMIT 句は、結果セットを適切なサイズに保ちます。



    1. DOUBLE(15,2)からDECIMAL(15,2)への変換

    2. 時間をiPhoneデバイスのタイムゾーンに変換するにはどうすればよいですか?

    3. ユーザーが検索するmysqlフィールドを指定できるようにするのは安全ですか?

    4. オラクルのマイナス演算子