2016-03-23 18 views
1

Ich versuche, den effizientesten Weg herauszufinden, um den neuesten Datensatz jeder Gruppe abzurufen.MySQL - unterschiedliches Ergebnis zur Anzeige des letzten Datensatzes jeder Gruppe

Ich kann zwei verschiedene Abfragen generieren. Aber die Details sind etwas anders.

Dies sind gcm_notification Datensätze. Es sind mehr Datensätze vorhanden. Aber jetzt möchte ich mich nur auf einen einzigen Datensatz konzentrieren. Aus dem Bild können wir die latest id = 1393 mit dem 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

Jetzt sehe ich versuche das neueste Datensatz jeder Gruppe unter Verwendung von 2 verschiedenen Abfragen abzurufen.

Option 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

Option 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

Wie Sie sehen können, zeigt Option 2 das korrekte Ergebnis an.

Das ist meine Frage,
Warum Option 1 zeigt die korrekte id aber der flag Wert falsch ist? Ist es, weil MAX nur die aktuelle id aktualisieren, aber nicht die Flagge?

- Entschuldigung, wenn die SQL-Abfrage zu unordentlich und schwer zu lesen ist, weil ich nicht weiß, wie man die Syntax hervorhebt. -

Antwort

1

Die Auswahl der nicht aggregierten Spalten ist unbestimmt, weshalb die erste Abfrage nicht korrekt ist.

MySQL-Handbuch:

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

Wenn ONLY_FULL_GROUP_BY deaktiviert ist, eine MySQL-Erweiterung zum Standard-SQL Verwendung von GROUP BY ermöglicht die Auswahlliste, HAVING Bedingung oder ORDER BY-Liste nicht aggregierten Spalten beziehen sich auch wenn die Spalten nicht funktional von GROUP BY-Spalten abhängig sind. Dies führt dazu, dass MySQL die vorhergehende Abfrage akzeptiert. 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. Darüber hinaus kann die Auswahl von Werten aus jeder Gruppe nicht durch Hinzufügen einer ORDER BY-Klausel beeinflusst werden. Die Sortierung der Ergebnismenge erfolgt nach der Auswahl der Werte, und ORDER BY hat keinen Einfluss darauf, welchen Wert in welcher Gruppe der Server wählt. Das Deaktivieren von ONLY_FULL_GROUP_BY ist in erster Linie nützlich, wenn Sie wissen, dass aufgrund einer Eigenschaft der Daten alle Werte in jeder nichtaggregierten Spalte, die nicht in GROUP BY benannt sind, für jede Gruppe gleich sind.

+0

Dies ist die Erklärung, die ich suche! Vielen Dank für die Hervorhebung. – WeeHong

Verwandte Themen