Kā SQL programmā IZVĒLĪT rindas ar MAX(Kolonnas vērtība), DISTINCT pēc citas kolonnas?

Mana galds ir:

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

Man ir jāizvēlas katrs atsevišķs home, kurā ir datetime maksimālā vērtība.

Rezultāts būtu šāds:

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

Esmu mēģinājis:

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

Nestrādā. Rezultātu kopā ir 130 rindas, lai gan datu bāzē ir 187 rindas. Rezultātā ir daži home dublikāti.

-- 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ē. Tiek sniegti visi ieraksti.

-- 3 ..something exotic: 

Ar dažādiem rezultātiem.

Risinājums

Jūs esat tik tuvu! Viss, kas jums jādara, ir jāizvēlas abas mājas un tās maksimālais datuma laiks, pēc tam pievienojiet atpakaļ topten tabulai abus laukus:

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
Komentāri (22)

Tas darbosies pat tad, ja katrai mājvietai ir divas vai vairākas rindas ar vienādiem 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
Komentāri (8)

Domāju, ka tas ļaus sasniegt vēlamo rezultātu:

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

BUT, ja jums nepieciešami arī citi kolonnas, vienkārši izveidojiet savienojumu ar sākotnējo tabulu (skatiet Michael La Voie atbildi)

Ar vislabākajiem sveicieniem.

Komentāri (3)