使用最近的条目从两个表输出数据

时间:2015-02-03 18:28:25

标签: php mysql sql group-by union

我已经很好地寻找了一个类似的问题,但没有任何乐趣。我认为我的问题的答案是基于DISTINCT,GROUP和UNION,但是不能以任何有意义的方式将它们组合在一起。

我有2张桌子:

users(id, username)
activitylog(id, userid, usernamedisp, activity)

样本数据:

users 
id, username
 1, Joe Bloggs
 2, Jane Doe
 3, John Smith

activitylog
id, userid, usernamedisp, activity
 1,      3, John Smith  , logged in
 2,      3, John Smith  , visited about us page
 3,      1, Joe Bloggs  , logged in
 4,      3, John Smith  , logged out
 5,      2, Jane Doe    , logged in
 6,      1, Joe Bloggs  , logged out
 7,      2, Jane Doe    , visited about us page

(还有另一个不相关但有效的原因,即用户的名字出现在两个表格中)

我希望输出按user.id和activitylog.username的顺序列出用户,最后只列出最近的activitylog.activity,如下所示:

User, Username  , Last Activity 
   1, Joe Bloggs, logged out 
   2, Jane Doe  , visited about us page
   3, John Smith, logged out

虽然我可以通过在每个结果的循环内运行查询来实现这一点(来自activitylog的SELECT活动,其中userid = $ foo ORDER BY id DESC,LIMIT 0,1) - 我宁愿在一个很好的清理中运行它一段代码,因为用户数量可能在50到100之间,而且这个问题太多了我的安慰。

我确信这是可能的,但我似乎无法把它放在一起。

2 个答案:

答案 0 :(得分:1)

你需要一个由两部分组成的查询:一个用于获取usersID列表及其“max”id,这将是他们最新的活动。然后是一个容器查询,它获取这些ID并获取其余信息:

SELECT activitylog.userid, users.username, activitylog.activity
FROM activitylog
LEFT JOIN users ON activitylog.userid = users.id
WHERE activitylog.id IN (
   SELECT MAX(id)
   FROM activitylog
   GROUP BY userid
)

答案 1 :(得分:0)

续来自评论中的讨论...

此查询应该为您提供您正在寻找的下一个解决方案集。

SELECT AL.userid
    ,users.username
    ,AL.activity
FROM users
LEFT JOIN (
    SELECT activitylog.userid
        ,activitylog.activity
    FROM activitylog
    WHERE activitylog.id IN (
            SELECT MAX(id)
            FROM activitylog
            GROUP BY userid
            )
    ) as AL ON AL.userid = users.id