2012-02-07 64 views
1

我只能通過實例說明問題.. 如果我有這樣的數據獲取最新添加的記錄在數據庫中

use-id   user-name   add-date 
--------------------------------------------------- 
    2    sami    17/1/2011 
    2    sami    18/1/2011 
    3    alaa    18/1/2011 
    4    jamal    19/1/2011 

我想爲每個用戶選擇最新的行,我想這個數據結果爲:

use-id   user-name   add-date 
--------------------------------------------------- 
    2    sami    18/1/2011 
    3    alaa    18/1/2011 
    4    jamal    19/1/2011 

對於每個唯一的用戶ID我想獲得最新添加的記錄。怎麼樣 ?

+0

感謝這個問題,我也需要答案。 – panoet 2014-12-05 10:36:13

回答

0

一種方法是獲得最新記錄每個用戶的日期:

select `use-id`, max(`add-date`) as `latest` 
from <table_name> 
group by `use-id` 

我們會打電話給該查詢newest_records,並用它來只選擇擁有最新日期的那些行:

select a.* 
from <table_name> 
inner join newest_records b 
on a.`use-id` = b.`use-id` and a.`add-date` = b.`latest` 

編輯:

全部放在一起(複製/粘貼),我們有:

select a.* 
from <table_name> 
inner join ( 
    select `use-id`, max(`add-date`) as `latest` 
    from <table_name> 
    group by `use-id`) b 
on a.`use-id` = b.`use-id` and a.`add-date` = b.`latest` 
+0

爲什麼需要第二個查詢?不是第一次做什麼需要? – Adham 2012-02-07 21:36:49

+0

@Bader - 不,第一個查詢只獲取'use-id'和'date' - **不是整行**。第二個查詢使用第一個查詢來獲取感興趣的行中的其餘列。當然,你可以把它們合併成一個查詢,我只是認爲把它們分開使它看起來更清晰。 – 2012-02-07 21:40:46

+0

謝謝,請選擇'use-id','use-name',max('add-date')作爲'latest'。 from group by'use-id' ..是正確的? – Adham 2012-02-07 21:43:08

0

正如我看到它User-Id確定User-NameUser-Id --> User-Name)。這意味着不會有兩個相同的User-Id s與不同的User-Name s。並且您的數據清楚地顯示了User-Id號碼2,它們具有相同的User-Namesami)。

因此,這將是有效的做一個更簡單,更高效的查詢:

select user-id, user-name, max(add-date) from table1 
group by user-id, user-name 

注:MySQL也允許你從GROUP BY

現在刪除user-name,明確你的表是缺乏Normalization。你的表應該是這樣的:

YourTable(User-Id, Add-Date)

而且你還應該有另一個表Users看起來應該是這樣的:

Users(User-Id, User-Name)

而且讓你在這個期待結果新的模式,你應該把這兩個表。

相關問題