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

グループ化前のMySQLの注文

    select wp_posts.* from wp_posts
    where wp_posts.post_status='publish'and wp_posts.post_type='post'
    group by wp_posts.post_author
    having wp_posts.post_date = MAX(wp_posts.post_date) /* ONLY THE LAST POST FOR EACH AUTHOR */
    order by wp_posts.post_date desc

    編集:

    いくつかのコメントの後、私はいくつかの追加情報を追加することにしました。

    私が働いている会社もPostgres、特にSQLServerを使用しています。このデータベースでは、このようなクエリは許可されていません。だから私はこれを行う他の方法があることを知っています(私は以下に解決策を書きます)。また、プロジェクションで処理されるすべての列でグループ化しない場合、または集計関数を使用しない場合は、何をするかを知っておく必要があります。それ以外の場合はそのままにしてください!

    それは特定の質問なので、私は上記の解決策を選びました。トムは、ワードプレスサイトで各著者の最近の投稿を取得したいと考えています。私の考えでは、著者が1秒間に複数の投稿を行う場合、分析は無視できます。 Wordpressは、スパムの二重投稿検出によってそれを禁止する必要があります。個人的な経験から、MySQLを使用してこのような汚いグループを実行すると、パフォーマンスに非常に大きなメリットがあることがわかります。しかし、あなたが何をしているのかを知っていれば、あなたはそれを行うことができます!私は専門的に責任を負っているアプリにそのような汚いグループを持っています。ここに、100++秒ではなく5〜15秒を必要とするmio行を含むテーブルがあります。

    一部の長所と短所について役立つ場合があります: http://ftp.nchu.edu.tw/MySQL/tech-resources/articles/debunking-group-by-myths.html

    SELECT
        wp_posts.*
    FROM 
        wp_posts
        JOIN 
        (
            SELECT
                g.post_author
                MAX(g.post_date) AS post_date
            FROM wp_posts as g
            WHERE
                g.post_status='publish'
                AND g.post_type='post'
            GROUP BY g.post_author
        ) as t 
        ON wp_posts.post_author = t.post_author AND wp_posts.post_date = t.post_date
    
    ORDER BY wp_posts.post_date
    

    ただし、著者の1秒あたりの投稿数が1つを超える場合は、最後の1つだけではなく、1行以上を取得します。

    これで、ホイールをもう一度回して、Idが最も高い投稿を取得できます。 。ここでも、少なくとも最後のものを確実に入手できるとは限りません。



    1. MariaDBデータベースを暗号化された状態と暗号化されていない状態に移動する

    2. 2017 @ Somenines:お客様のストーリーを祝う

    3. Oracle(+)演算子

    4. Oracleの列の組み合わせに一意性制約を与えるにはどうすればよいですか?