Kuidas ma saan SELECT ridade MAX(Column väärtus), DISTINCT teise veeru SQL?

Minu tabel on:

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

Mul on vaja valida kõik erinevad kodu, mis sisaldavad maksimaalset väärtust kuupäeva.

Tulemus oleks:

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

Mina olen proovinud:

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

Ei tööta. Tulemuste komplektis on 130 rida, kuigi andmebaasis on 187 rida. Tulemus sisaldab mõningaid duplikaate 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 

Ei. Annab kõik kirjed.

-- 3 ..something exotic: 

Erinevate tulemustega.

Lahendus

Sa oled nii lähedal! Kõik, mida sa pead tegema, on valida KÕIK kodu- ja selle maksimaalse kuupäeva aeg, seejärel liita tagasi tabelisse topten KÕIK väljad:

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

See töötab isegi siis, kui teil on iga "kodu" jaoks kaks või enam rida, millel on võrdne "DATETIME":

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

Ma arvan, et see annab teile soovitud tulemuse:

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

MUT kui teil on vaja ka teisi veerge, tehke lihtsalt liitmine algse tabeliga (vaadake Michael La Voie vastust).

Parimad tervitused.

Kommentaarid (3)