使用最近的条目从两个表中输出数据
Output data from two tables using most recent entry
我已经很好地搜索了类似的问题,但没有任何乐趣。我认为我的问题的答案是基于 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
(用户名出现在两个表中还有另一个无关但有效的原因)
我希望输出按照 users.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
虽然我可以通过 运行 在每个结果的循环内查询来做到这一点(SELECT activity 来自 activitylog where userid = $foo ORDER BY id DESC, LIMIT 0,1) - 我宁愿 运行 在一段干净的代码中全部关闭,因为用户数量可能在 50-100 之间,而且查询太多让我感到不舒服。
我确定这是可能的,但我似乎无法将它们组合在一起。
您需要一个分为两部分的查询:一个是获取用户 ID 列表及其 "max" id,这将是他们最新的 activity。然后是一个容器查询,它获取这些 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
)
续来自评论中的讨论...
此查询应该会为您提供您正在寻找的下一个解决方案集。
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
我已经很好地搜索了类似的问题,但没有任何乐趣。我认为我的问题的答案是基于 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
(用户名出现在两个表中还有另一个无关但有效的原因)
我希望输出按照 users.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
虽然我可以通过 运行 在每个结果的循环内查询来做到这一点(SELECT activity 来自 activitylog where userid = $foo ORDER BY id DESC, LIMIT 0,1) - 我宁愿 运行 在一段干净的代码中全部关闭,因为用户数量可能在 50-100 之间,而且查询太多让我感到不舒服。
我确定这是可能的,但我似乎无法将它们组合在一起。
您需要一个分为两部分的查询:一个是获取用户 ID 列表及其 "max" id,这将是他们最新的 activity。然后是一个容器查询,它获取这些 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
)
续来自评论中的讨论...
此查询应该会为您提供您正在寻找的下一个解决方案集。
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