Wie kann ich SELECT Zeilen mit MAX(Spaltenwert), DISTINCT durch eine andere Spalte in SQL?

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.

Lösung

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
Kommentare (22)

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
Kommentare (8)

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.

Kommentare (3)