2016-03-23 9 views
1

各グループの最新のレコードを取得する最も効率的な方法を見つけようとしています。MySQL - 各グループの最新レコードを表示する異なる結果

私は2つの異なるクエリを生成することができます。しかし、詳細は少し異なります。

これらは、gcm_notificationレコードです。 さらにレコードが存在します。しかし今はただ一つのレコードに集中したい。画像から、我々は今、私は2つの異なるクエリを使用して、各グループの最新のレコードを取得しようとしていますflag = 1

SELECT id, post_id, registration_id, flag 
FROM gcm_notification 
WHERE post_id = 1743 
AND registration_id = "ezDCef_3ORo:APA91bG-sSjaMR9OwylrV7A0H7dvTEAfwJNYGUa3Ud5QZhNIh7-r2peLrb9H33pUs_KJkYisnsIUL4bUT1xrqffOv2jYXBB348oNgNVmLHGZrmgLFdWQiSVRfq9A8BhAGoBB0xN-aDs-" 

enter image description here

latest id = 1393を見ることができます。

オプション1:

SELECT MAX(id) as latest_id, post_id, flag 
FROM gcm_notification 
WHERE registration_id = "ezDCef_3ORo:APA91bG-sSjaMR9OwylrV7A0H7dvTEAfwJNYGUa3Ud5QZhNIh7-r2peLrb9H33pUs_KJkYisnsIUL4bUT1xrqffOv2jYXBB348oNgNVmLHGZrmgLFdWQiSVRfq9A8BhAGoBB0xN-aDs-" 
GROUP BY post_id 

enter image description here

オプション2:

SELECT id, post_id, flag 
FROM gcm_notification t1 
    RIGHT JOIN (
      SELECT MAX(id) AS latest 
      FROM wp_spc_gcm_notification 
      WHERE registration_id = "ezDCef_3ORo:APA91bG-sSjaMR9OwylrV7A0H7dvTEAfwJNYGUa3Ud5QZhNIh7-r2peLrb9H33pUs_KJkYisnsIUL4bUT1xrqffOv2jYXBB348oNgNVmLHGZrmgLFdWQiSVRfq9A8BhAGoBB0xN-aDs-" 
      GROUP BY post_id) t2 
    ON t1.id = t2.latest 
WHERE registration_id = "ezDCef_3ORo:APA91bG-sSjaMR9OwylrV7A0H7dvTEAfwJNYGUa3Ud5QZhNIh7-r2peLrb9H33pUs_KJkYisnsIUL4bUT1xrqffOv2jYXBB348oNgNVmLHGZrmgLFdWQiSVRfq9A8BhAGoBB0xN-aDs-" 
GROUP BY post_id 

enter image description here

ご覧のとおり、オプション2は正しい結果を表示します。

これは私の質問は、
なぜオプション1ディスプレイ正しいidしかしflag値が間違っているのですか?それはMAXが最新のidを更新するだけで、フラグは更新しないからですか?

- 文を強調する方法がわからないので、SQLクエリがあまりにも面倒で読みにくい場合は申し訳ありません。 -

答えて

1

非集約列の選択は不確定です。そのため、最初のクエリが正しくないのはこのためです。

MySQLのマニュアル:

http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

ONLY_FULL_GROUP_BYが無効になっている場合は、GROUP BYの標準SQLを使用することにMySQLの拡張が状態を有する、選択リストを許可、あるいは非凝集列を参照するORDER BYリスト列が機能的にGROUP BY列に依存していない場合これにより、MySQLは前述のクエリを受け入れます。 In this case, the server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate, which is probably not what you want.さらに、各グループからの値の選択は、ORDER BY句の追加によって影響を受けることはありません。結果セットのソートは、値が選択された後に行われ、ORDER BYはサーバーが選択する各グループ内のどの値に影響を与えません。 ONLY_FULL_GROUP_BYを無効にすると、主に、データの一部のプロパティのために、GROUP BYで名前が付けられていない各集約されていない列のすべての値が各グループで同じであることがわかっている場合に役立ちます。

+0

これは私が探している説明です! ありがとうございます。 – WeeHong