2012-02-02 84 views
4

我有一個包含三列的MySQL(5.1.49)表。選擇具有不同值和最大日期的行

mysql> create table testme(id int auto_increment, id2 int not null, somedate datetime, primary key(id)); 

在我的情況ID2不是唯一的,但我想用不同的ID2與最大somedate返回行值。

以下是一些示例數據。

mysql> insert into testme values (1, 5, '2012-01-02 01:01:01'),(2, 5, '2012-02-02 02:02:02'),(3, 7, '2010-01-10 11:01:33'); 

question幾乎回答我的,但額外的id字段,返回IDID2不匹配。對於id2 = 5,它返回id = 1而不是id = 2

mysql> select id, id2, max(somedate) from testme group by id2; 
+----+-----+---------------------+ 
| id | id2 | max(somedate)  | 
+----+-----+---------------------+ 
| 1 | 5 | 2012-02-02 02:02:02 | 
| 3 | 7 | 2010-01-10 11:01:33 | 
+----+-----+---------------------+ 

我很期待,

+----+-----+---------------------+ 
| id | id2 | max(somedate)  | 
+----+-----+---------------------+ 
| 2 | 5 | 2012-02-02 02:02:02 | 
| 3 | 7 | 2010-01-10 11:01:33 | 
+----+-----+---------------------+ 

想,對於匹配最大日ID每個ID2

沒有人有任何想法,請?由於

回答

8

該查詢肯定會工作,雖然可能不是最優的:

select t.id, s.id2, s.somedate 
from testme t 
    join 
    (select id2, max(somedate) as somedate 
     from testme 
     group by id2 
    ) s 
    on s.id2 = t.id2 
    and s.somedate = t.somedate; 
+0

我沒有很多的記錄 - 這很好。謝謝 – wsams 2012-02-05 04:10:11

-1

不知道,但根據你的榜樣,試試這個:

select max(id) as Id,id2,max(someDate) from testMe group by Id2 
+0

比@triclosan回答同樣的評論。如果你執行INSERT INTO testme(id,id2,somedate)VALUES(4,8,'2012-02-02 02:02:02'); INSERT INTO testme(id,id2,somedate)VALUES(5,8,'2010-01-02 01:01:01');'您的查詢將返回'5,8,2012-02-02 02:02: 02'。 – 2012-02-02 15:58:54

+0

的確如此,但我讀過他的例子,並補充說明他正在努力完成什麼。一旦我意識到這是不正確的,就沒有時間刪除我的答案。對不起 – Sparky 2012-02-02 16:15:16

-1
select id2, max(id), max(somedate) from testme group by id2; 
+1

這不會在一般情況下工作 – itsmeee 2012-02-02 15:39:25

+1

這隻適用於這種情況,因爲行號二有最大id和最大somedate。例如,如果第1行具有最大限度的日期,它將不起作用。 – 2012-02-02 15:47:50

1

的您的問題的替代解決方案:

SELECT t0.id, t0.id2, t0.somedate 
FROM testme AS t0 
LEFT JOIN testme AS t1 
    ON t0.id2 = t1.id2 
    AND t1.somedate > t0.somedate 
WHERE t1.id IS NULL; 

像@itsmeee的解決方案,如果id2, somedate對不是唯一的,它會帶來兩行:

+----+-----+---------------------+ 
| id | id2 | somedate   | 
+----+-----+---------------------+ 
| 4 | 8 | 2012-02-02 02:02:02 | 
| 6 | 8 | 2012-02-02 02:02:02 | 
+----+-----+---------------------+ 

如果id2, somedate雙不是唯一的,由於某種原因,你需要每id2結果只有一個,你可以讓MySQL使用額外的GROUP BY t0.id2子句爲您選擇一個。但要警告的是,這是非標準的SQL行爲。

1

當要獲取一組記錄中的最大日期時,不建議將max(date)與其他行組合。當然,你總是會得到max(date),但其他領域將是該集合中的第一次出現。這裏是一個回答你的問題,用你的表爲例:

+----+-----+---------------------+ 
| id | id2 | somedate   | 
+----+-----+---------------------+ 
| 1 | 5 | 2012-01-02 01:01:01 | 
| 2 | 5 | 2012-02-02 02:02:02 | 
| 3 | 7 | 2010-01-10 11:01:33 | 
+----+-----+---------------------+ 
select id, id2, somedate from testme t1 
where somedate = 
(select max(somedate) from testme t2 where t2.somedate = t1.somedate) 
order by somedate desc 
相關問題