2016-05-24 12 views
0

Jede Seite in meinem System hat mehrere page_objects. Ich muss die last_changed Datensätze meiner page_objects pro Seite zurückgeben.Abfrage max (Datum) mit Gruppe, indem nicht auf SELECT ... IN?

DB-Auswirkungen zu verringern, ich habe eine SELECT ... IN Abfrage jedes zuletzt bearbeitet page_object pro Seite zurückzukehren:

SELECT object, f_page_id, page_object_id, last_change 
FROM page_objects 
WHERE f_page_id IN (page_id1, page_id2, page_id3, etc...) GROUP BY f_page_id 
ORDER BY last_change ASC; 

Natürlich ist dies nicht funktioniert, weil GROUP BY vor ORDER BY angewendet wird, also habe ich die Abfrage:

SELECT object, f_page_id, page_object_id, max(UNIX_TIMESTAMP(last_change)) 
FROM page_objects 
WHERE f_page_id IN (page_id1, page_id2, page_id3, etc...) GROUP BY f_page_id 

Aber dies noch nicht das letzte bearbeitet page_object pro page_id zurückgibt.

Was mache ich falsch?

+0

versuchen Sie es mit Unterabfrage. obwohl es maximalen und minimalen Wert für Gruppe auswählt, gibt es die erste f_page_id innerhalb der Gruppe zurück. – Faraz

Antwort

2

Ihre Abfrage gibt nicht an, den Datensatz für den letzten last_change zu erhalten. Nur dass es den letzten Wert von last_change erhält. Die anderen nicht aggregierten Werte (dh nicht das Ergebnis einer Aggregatfunktion wie MAX oder MIN), die in der GROUP BY-Klausel nicht erwähnt werden, können aus einer beliebigen Zeile für die gruppierten Werte stammen.

Als solche verwenden Sie eine Sub-Abfrage den letzten Wert für jede Seite zu bekommen, und dann, dass gegen den Haupt Tisch sitzen zurück, um die passenden Zeilen

So etwas wie diese: -

SELECT page_objects.object, 
     page_objects.f_page_id, 
     page_objects.page_object_id, 
     page_objects.last_change 
FROM page_objects 
INNER JOIN 
(
    SELECT f_page_id, MAX(last_change) AS latest_last_change 
    FROM page_objects 
    GROUP BY f_page_id 
) sub0 
ON page_objects.f_page_id = sub0.f_page_id 
AND page_objects.last_change = sub0.latest_last_change 
WHERE page_objects.f_page_id IN (page_id1, page_id2, page_id3, etc...) 
ORDER BY last_change DESC 

Beachten Sie, dass MySQL ziemlich ungewöhnlich ist, wenn Sie nicht aggregierte Spalten haben dürfen, die in der GROUP BY-Klausel nicht erwähnt werden (wie unter bestimmten Umständen auch gegen SQL-Standards). Die meisten SQL-Varianten geben einen Fehler aus, wenn Sie dies versuchen, und MySQL hat einen Konfigurationsparameter, der ähnliche Abfragen ablehnt.

+0

Ich habe Ihr Beispiel versucht, aber es gibt keine Ergebnisse zurück. Nach Ihrer Antwort muss ich das auf eine andere Weise versuchen? Was empfehlen Sie in dieser Situation eine Abfrage pro Seite? (also statt 1 Abfrage, wie 20 Abfragen) – Abayob

+0

@Abayob - So etwas wie das sollte funktionieren. Können Sie Ihre Tabelle deklarieren und ein paar Beispieldaten, dann habe ich eine Chance, es zu testen. Obwohl ich meinen Code jetzt wieder betrachte, denke ich, dass das Problem wahrscheinlich darin besteht, dass die Unterabfrage das last_change-Datum in einen UNIX_TIMESTAMP konvertiert hat - den Code aktualisiert, also versuche es jetzt. – Kickstart

+0

Aaah natürlich, weck mich auf! Ich werde das zuerst überprüfen und wenn es immer noch nicht funktioniert, werde ich ein sql-Beispiel erstellen. – Abayob