2012-02-07 128 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)

而且让你在这个期待结果新的模式,你应该把这两个表。

相关问题