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

MySQL MIN / MAXは適切な値を返しますが、関連するレコード情報は返しません

    非集計をGROUPBYクエリに含めることを許可するMySQLの緩いルールの餌食になりました。確かに、あなたはMINまたはMAXで作業しており、1つのみを使用しています 一度に、ただしこのクエリを検討してください:

    SELECT 
        CONCAT(work_type, work_id) AS condition_id, 
        status,
        MIN(created_timestamp) as earliest,
        MAX(created_timestamp) as latest
      FROM conditions
      GROUP BY condition_id
    

    次に、どの行について考えます。 ステータス列はから取得する必要があります。集計(GROUP BY内の列)と非集計列の間に相関関係を置くのはばかげています。

    代わりに、次のようにクエリを記述してください

    SELECT X.condition_id, C.status, X.earliest
    FROM (
      SELECT 
        CONCAT(work_type, work_id) AS condition_id, 
        status,
        MIN(created_timestamp) as earliest
      FROM conditions
      GROUP BY condition_id
    ) X JOIN conditions C
      on CONCAT(c.work_type, c.work_id) = X.condition_id
      and c.created_timestamp = X.earliest
    

    ただし、同じcreated_timestampを持つ2つのレコードがある場合は、さらに注意が必要です

    SELECT X.condition_id, Max(C.status) status, X.earliest
    FROM (
      SELECT 
        CONCAT(work_type, work_id) AS condition_id, 
        status,
        MIN(created_timestamp) as earliest
      FROM conditions
      GROUP BY condition_id
    ) X JOIN conditions C
      on CONCAT(c.work_type, c.work_id) = X.condition_id
      and c.created_timestamp = X.earliest
    GROUP BY X.condition_id, X.earliest
    


    1. 繰り返されるサブクエリで巨大なクエリを最適化する方法

    2. N+1の冗長性とサーバーの統合

    3. マテリアライズド・ビューにテーブルがありません

    4. サーバーのタイムゾーンがUTCでない場合に、JavaでMySQLからUTCDATETIMEフィールドを取得する