我已经很好地寻找了一个类似的问题,但没有任何乐趣。我认为我的问题的答案是基于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之间,而且这个问题太多了我的安慰。
我确信这是可能的,但我似乎无法把它放在一起。
答案 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