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

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