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

MySQLgroupbyおよびmaxが間違った行を返す

    私はいつもこの問題に遭遇します。 MySQLが集計関数を実行すると、集計されていない列に対して、MAX行からのものであるかどうかに関係なく、そのグループで最初に実行されたデータをプルするだけです。したがって、あなたがしなければならないことは、最大値がそれらのグループの最初になるように、内部クエリのデータを並べ替えることです。これがうまくいくかどうかを確認してください:

    SELECT t.post_id,
           t.profile_id,
           t.score,
           t.pubdate_utc
    FROM (SELECT p.profile_id,
                 p.post_id,
                 p.pubdate_utc,
                 (pp.comments + pp.likes + pp.favorites) score
          FROM posts p
          JOIN posts_points pp ON p.post_id = pp.post_id
          WHERE p.pubdate_utc >= DATE_ADD(DATE(NOW()), INTERVAL -17 DAY)
          ORDER BY score DESC
         ) t
    GROUP BY DATE(t.pubdate_utc) DESC
    ;
    

    ここではMAX関数を使用していないことに注意してください。スコアの降順で並べ替えてから、外部クエリで日付でグループ化すると、日付で最高のスコアが表示されます。また、内部クエリにWHERE句を配置していることにも注意してください。このような内部クエリ(場合によっては必要)は、最適化する外部クエリのインデックスがないため、あまり効率的ではありません。したがって、内部結果セットをできるだけ小さくしてください。最後に、GROUP BY DATE(t.pubdate_utc)に注目してください。日付情報だけに絞り込まないと、時間もカウントされるため、18を超える結果が得られます。

    編集:INTERVAL -17 DAYに変更 19ではなく最大18の結果を提供します。



    1. Ubuntu18.04にSQLServerをインストールする方法

    2. MySQL:更新されただけでなくすべての行を削除します

    3. SQL ServerのVarchar(max)に対してNOT NULLがNULL値を返すのはなぜですか?

    4. OracleでSQLを使用して現在の年を取得するにはどうすればよいですか?