Mein Tisch ist:
id home datetime player resource
---|-----|------------|--------|---------
1 | 10 | 04/03/2009 | john | 399
2 | 11 | 04/03/2009 | juliet | 244
5 | 12 | 04/03/2009 | borat | 555
3 | 10 | 03/03/2009 | john | 300
4 | 11 | 03/03/2009 | juliet | 200
6 | 12 | 03/03/2009 | borat | 500
7 | 13 | 24/12/2008 | borat | 600
8 | 13 | 01/01/2009 | borat | 700
Ich muss jedes eindeutige "home" auswählen, das den maximalen Wert von "datetime" enthält.
Das Ergebnis wäre:
id home datetime player resource
---|-----|------------|--------|---------
1 | 10 | 04/03/2009 | john | 399
2 | 11 | 04/03/2009 | juliet | 244
5 | 12 | 04/03/2009 | borat | 555
8 | 13 | 01/01/2009 | borat | 700
Ich habe versucht:
-- 1 ..by the MySQL manual:
SELECT DISTINCT
home,
id,
datetime AS dt,
player,
resource
FROM topten t1
WHERE datetime = (SELECT
MAX(t2.datetime)
FROM topten t2
GROUP BY home)
GROUP BY datetime
ORDER BY datetime DESC
Funktioniert nicht. Die Ergebnismenge hat 130 Zeilen, obwohl die Datenbank 187 Zeilen enthält. Das Ergebnis enthält einige Duplikate von "home".
-- 2 ..join
SELECT
s1.id,
s1.home,
s1.datetime,
s1.player,
s1.resource
FROM topten s1
JOIN (SELECT
id,
MAX(datetime) AS dt
FROM topten
GROUP BY id) AS s2
ON s1.id = s2.id
ORDER BY datetime
Nö. Es werden alle Datensätze angezeigt.
-- 3 ..something exotic:
Mit verschiedenen Ergebnissen.
Sie sind so nah dran! Alles, was Sie tun müssen, ist, BEIDE Häuser und ihre maximale Datumszeit auszuwählen und dann beide Felder mit der Tabelle "Topten" zu verbinden:
SELECT tt.*
FROM topten tt
INNER JOIN
(SELECT home, MAX(datetime) AS MaxDateTime
FROM topten
GROUP BY home) groupedtt
ON tt.home = groupedtt.home
AND tt.datetime = groupedtt.MaxDateTime
Dies funktioniert auch dann, wenn Sie zwei oder mehr Zeilen für jedes "home" mit gleichen "DATETIME"-Zeilen haben:
SELECT id, home, datetime, player, resource
FROM (
SELECT (
SELECT id
FROM topten ti
WHERE ti.home = t1.home
ORDER BY
ti.datetime DESC
LIMIT 1
) lid
FROM (
SELECT DISTINCT home
FROM topten
) t1
) ro, topten t2
WHERE t2.id = ro.lid
Ich denke, dass Sie damit das gewünschte Ergebnis erzielen werden:
SELECT home, MAX(datetime)
FROM my_table
GROUP BY home
Aber wenn Sie auch andere Spalten benötigen, machen Sie einfach eine Verknüpfung mit der ursprünglichen Tabelle (siehe die Antwort von Michael La Voie)
Mit freundlichen Grüßen.