SQL'de başka bir sütuna göre MAX(Sütun değeri), DISTINCT içeren satırları nasıl SELECT edebilirim?

Masam:

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

Maksimum datetime değerini tutan her bir farklı homeu seçmem gerekiyor.

Sonuç şöyle olacaktır:

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

Denedim ki:

-- 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

Çalışmıyor. Veritabanında 187 satır olmasına rağmen sonuç kümesinde 130 satır var. Sonuç, home öğesinin bazı kopyalarını içerir.

-- 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 

Hayır. Tüm kayıtları veriyor.

-- 3 ..something exotic: 

Çeşitli sonuçlarla.

Çözüm

Çok yaklaştınız! Tek yapmanız gereken hem evi hem de maksimum tarih saatini seçmek, ardından HER İKİ alanda topten tablosuna geri katılmaktır:

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

Bu, her home için eşit DATETIME'lere sahip iki veya daha fazla satırınız olsa bile çalışacaktır:

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

Sanırım bu size istediğiniz sonucu verecektir:

SELECT   home, MAX(datetime)
FROM     my_table
GROUP BY home

AMA başka sütunlara da ihtiyacınız varsa, orijinal tablo ile birleştirme yapmanız yeterlidir (Michael La Voie yanıtını kontrol edin)

Saygılarımla.

Yorumlar (3)