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

MySQLの順序付け前にグループ化

    ORDER BYを使用する サブクエリでのこの問題の最善の解決策ではありません。

    max(post_date)を取得するための最良の解決策 作成者は、サブクエリを使用して最大日付を返し、それを両方のpost_authorのテーブルに結合します。 と最大日。

    解決策は次のとおりです。

    SELECT p1.* 
    FROM wp_posts p1
    INNER JOIN
    (
        SELECT max(post_date) MaxPostDate, post_author
        FROM wp_posts
        WHERE post_status='publish'
           AND post_type='post'
        GROUP BY post_author
    ) p2
      ON p1.post_author = p2.post_author
      AND p1.post_date = p2.MaxPostDate
    WHERE p1.post_status='publish'
      AND p1.post_type='post'
    order by p1.post_date desc
    

    次のサンプルデータがある場合:

    CREATE TABLE wp_posts
        (`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
    ;
    
    INSERT INTO wp_posts
        (`id`, `title`, `post_date`, `post_author`)
    VALUES
        (1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
        (2, 'Title2', '2013-02-01 00:00:00', 'Jim')
    ;
    

    サブクエリは、次の最大日付と作成者を返します:

    MaxPostDate | Author
    2/1/2013    | Jim
    

    次に、それをテーブルに結合しているので、両方の値で、その投稿の完全な詳細を返します。

    SQL Fiddle withDemo を参照してください。 。

    サブクエリを使用してこのデータを正確に返すことについての私のコメントを拡張します。

    MySQLはGROUP BYを強制しません SELECTに含めるすべての列 リスト。その結果、GROUP BYのみの場合 1列ですが、合計10列を返します。post_authorに属する他の列の値が保証されるわけではありません。 それが返されます。列がGROUP BYにない場合 MySQLは返される値を選択します。

    集計関数でサブクエリを使用すると、毎回正しい作成者と投稿が返されることが保証されます。

    ちなみに、MySQLではORDER BYを使用できます サブクエリで、GROUP BYを適用できます SELECTのすべての列ではありません この動作は、SQLServerを含む他のデータベースでは許可されていません。



    1. エンティティフレームワークを使用してストアドプロシージャを実行する

    2. ''の近くの構文が正しくありません

    3. [更新2]重大:Officeの更新によりアクセスが中断されます—クエリが破損しています

    4. 誤ってpostgresのデフォルトのスーパーユーザー権限を削除しました-元に戻すことはできますか?