从数据库中的每个用户检索最后插入的行

时间:2013-05-03 21:57:33

标签: php mysql sql greatest-n-per-group

我想用php在mysql中进行查询,并从数据库中的每个用户获取最后一行。我举个例子。

假设我们有一个包含10行的表

ID    Message   User     Date inserted

1      lala1    chris     13/02/2010 12:13
2      lala2    john      14/02/2010 12:14
3      lala3   george    15/03/2009 12:00
4      lala4    jack      01/04/2013 11:09
5      lala5    ina       12/08/2012 15:00
6      lala6    chris     13/03/2010 12:13
7      lala7    john      14/01/2010 12:04
8      lala8   george    15/02/2009 12:00
9      lala9    jack      01/03/2013 11:09
10     lala10    ina       12/05/2012 15:00

我想进行查询以获取chris,john和ina按日期排序的最后一行。所以结果应该是这样的:

5      lala5    ina       12/08/2012 15:00
6      lala6    chris     13/03/2010 12:13
2      lala2    john      14/02/2010 12:14

然后在我从这些用户那里得到最后插入的行后,我想再次进行查询以再次为这些用户获取上一个插入的行,结果应为:

10     lala10    ina       12/05/2012 15:00
1      lala1    chris     13/02/2010 12:13
7      lala7    john      14/01/2010 12:04

依旧......

任何帮助表示赞赏!

4 个答案:

答案 0 :(得分:2)

对于第一部分:(将为所有用户提供所有最后一次插入记录。您可以应用过滤器以仅获得3个用户)

SELECT t1.*
FROM Users t1
INNER JOIN (
    SELECT User, MAX(Date_Inserted) as MaxDate
    FROM Users
    GROUP BY User
) t2 ON t1.User = t2.User AND t1.Date_Inserted = t2.MaxDate

你也可以尝试替换

GROUP By User

WHERE User IN (User_1, User_2, User_3)

用这3个用户名替换User_1User_2User_3

答案 1 :(得分:2)

如果您需要获取最后一个,然后是前一个,依此类推,则需要使用排名功能:

SELECT *
FROM (
  SELECT
    Users.*,
    CASE WHEN @lst=User THEN @row:=@row+1 ELSE @row:=0 END row,
    @lst:=User
  FROM
    Users
  WHERE
    User IN ('ina','chris','john')
  ORDER BY
    User, Date_ins DESC
) s
WHERE
  row=0

row = 0将获取最后一个日期,row = 1是前一个日期,依此类推......

请参阅小提琴here

答案 2 :(得分:1)

请查看strtotime找到here。有了它,您可以将时间戳转换为整数并进行比较。另外一个更好的方法就是按ID排序表并限制一个。

答案 3 :(得分:1)

您必须在SQL查询中使用GROUP BY

SELECT DISTINCT User, MAX(Date_inserted) FROM yourTable GROUP BY User