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

GROUPBYからJOINへの変換のためのORDERBYサブクエリ

    これは次のように簡略化できます(ORDER BY サブクエリでは役に立たない):

    SELECT * 
    FROM table
    GROUP BY title
    

    なぜJOINが必要だと思いますか ? (わかりました、これはコメントによって解決されました。)

    すべてのタイトル、タイムスタンプが最大の行に必要なコメントの後、これで作業が完了します:

    SELECT t.* 
    FROM
        table AS t
      JOIN
        ( SELECT title
               , MAX(timestamp) AS maxts
          FROM table
          GROUP BY title
        ) AS grp
        ON grp.title = t.title
        AND grp.maxts = t.timestamp
    ORDER BY t.timestamp DESC
    

    記録のために、元のクエリ:

    SELECT * 
    FROM 
      ( SELECT * 
        FROM table 
        ORDER BY timestamp DESC 
      ) m
    GROUP BY title
    

    かもしれない 期待どおりに機能しますが、のみ SELECTで使用できるMySQLの GROUP BYにないフィールドを一覧表示します 句(またはそれらに依存)、それらに集約関数はありません。したがって、上記のクエリは多かれ少なかれランダムを返します すべてのタイトルの行。実際、タイトルの最初の行が返されます。したがって、最初にサブクエリを実行します(timestamp DESCで順序付けます )結果として、タイムスタンプが最大の行が最初に検索されます。

    ただし、これは、オプティマイザがサブクエリが役に立たないことを理解していないためにのみ発生します。ある日MySQLバージョン7.5にアップグレードすると、元のクエリが正常に実行され、クエリが以前と同じように機能しなくなる場合があります。 (オプティマイザーがより巧妙になり、サブ選択なしでクエリをより単純なものに変換したためです。)

    MySQLが将来のリリースでGROUP BYのSQL標準に準拠することを決定した場合、クエリが完全に機能しなくなり、エラーが発生する可能性もあります。 クエリ。



    1. 集計関数なしのGROUPBY

    2. SSMSの結果をグリッドに-CRLFはコピー/貼り付けで保存されません-より良いテクニックはありますか?

    3. Laravel5の雄弁なCONCATカラム

    4. TableGatewayを使用したZF2のLEFTJOIN