如何在mysql中检索最后一条记录?

时间:2011-04-08 12:00:58

标签: mysql

我有一个表名Data,字段为
SurmaneNameTimestampPaidMoneyChangAmmountAddressStore

我希望查询结果显示每个人的最后一条记录(DESC Timestamp限制1)(Surname分组,NamePaidMoneyChangeAmmountAddressStore

例如,结果必须是

Jones, Jim, 1290596796, 220.00, 0.25, 5th Avenue 120, Some Store1  
Kojak, Ian, 1290596890, 1000.00, 50.25, Derek Avenue 1020, Some Store2

对于Surname的每个组合,Name必须显示最后一条记录。

我试着这样做:

select `Surname`, 
       `Name`, 
        max(date_format(from_unixtime(`Timestamp`),'%Y/%m/%d - %T')) AS `dateTime`,
       `PaidMoney`, 
       `ChangAmmount`, 
       `Address`, 
       `Store` 
from `Data` 
group by `Surname`, `Name`;

没有正当理由这没有显示正确的数据.....

请帮助......

谢谢...

3 个答案:

答案 0 :(得分:1)

select t1.surname,
       t1.name,
       from_unixtime(t1.timestamp,'%Y/%m/%d - %T') as datetime,
       t1.PaidMoney, 
       t1.ChangAmmount, 
       t1.Address, 
       t1.Store 
from table as t1
inner join (select concat_ws(' ',name,surname) as n,max(timestamp) as timestamp 
        from table
        group by name,surname) as t2
on t1.timestamp = t2.timestamp and concat_ws(' ',t1.name,surname) = t2.n

您的表包含名称和姓氏的冗余数据。 如果将这些数据放在另一个表中并使用人员ID引用它们会更好。 此外,如果没有id,使用concat会降低连接性能,即使你有一个索引。

修改。

create view my_view as
select * from table t1
where timestamp = (select max(timestamp) from table as t2
                   where concat_ws(' ',t1.name,t1.surname) = concat_ws(' ',t2.name,t2.surname))     

答案 1 :(得分:0)

您应该在查询中添加order by timestamp DESC,并将max(...)部分更改为timestamp

答案 2 :(得分:0)

你可以做一个子查询(即一个嵌套的SELECT)来获取每个人的max(日期内容),但是根据这个页面,这不会非常有效,这表明了另一种可能有用的方法: / p>

http://dev.mysql.com/doc/refman/4.1/en/example-maximum-column-group-row.html