2016-03-23 19 views
1

Her grubun en son kayıtlarını almanın en verimli yolunu bulmaya çalışıyorum.MySQL - Her Grubun Son Kaydını Görüntülemek için Farklı Sonuç

İki farklı sorgu oluşturmayı beceriyorum. Ama detaylar biraz farklı. Bu değerler gcm_notification kayıtlıdır. Daha fazla kayıt var. Ama şimdi sadece tek bir kayda odaklanmak istiyorum. Görüntünün, biz Şimdi 2 farklı sorguları kullanarak her grubun son kayıt almak için çalışıyorum 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

ile latest id = 1393 görebilirsiniz.

Seçenek 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

Seçenek 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

Gördüğünüz gibi, Seçenek 2 doğru sonucu gösterir.

Bu sorum,
Neden Seçenek 1 görüntüler doğru id ama flag değeri yanlış mı? MAX sadece geçerli id güncel değil, ancak bayrak değil mi?

- SQL Sorgusu çok dağınık ve okunması zor olduğu için özür dilerim çünkü sözdizimini nasıl vurgulayacağımı bilmiyorum. -

cevap

1

Ayrıştırılmamış sütunlardan seçilen belirsizdir, bu nedenle ilk sorgu doğru değildir.

MySQL manuel:

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

ONLY_FULL_GROUP_BY devre dışı bırakılırsa, GROUP BY standart SQL kullanımına MySQL uzantısı bile nonaggregated sütunlara başvurmak için listeye TARAFINDAN seçim listesini, HAVING koşulu veya SİPARİŞ izin sütunlar işlevsel olarak GROUP BY sütunlarına bağlı değilse. Bu, MySQL'in önceki sorguyu kabul etmesine neden olur. Ayrıca, her gruba ait değerlerin seçimi, bir ORDER BY cümlesi eklenerek etkilenemez. Sonuç kümesi seçildikten sonra sonuç kümesi sıralaması yapılır ve ORDER BY, sunucunun seçtiği her gruptaki hangi değeri etkilemez. ONLY_FULL_GROUP_BY'yi devre dışı bırakmak, öncelikle, verilerin bazı özelliklerine bağlı olarak GROUP BY'de adlandırılmayan, toplanmamış her bir sütundaki tüm değerlerin her grup için aynı olduğunu bildiğinizde yararlıdır.

+0

Aradığım açıklama budur! Vurgu için teşekkürler. – WeeHong

İlgili konular