Php 使用最新条目从两个表中输出数据

Php 使用最新条目从两个表中输出数据,php,mysql,sql,group-by,union,Php,Mysql,Sql,Group By,Union,我已经很好地寻找了一个类似的问题,但毫无乐趣。我认为我的问题的答案是基于不同的、群体的和联合的,但不能以任何有意义的方式把它们放在一起 我有两张桌子: 样本数据: 两个表中出现用户名还有另一个不相关但有效的原因 我希望输出按users.id和activitylog.username的顺序列出用户,最后只列出最新的activitylog.activity,如下所示: 虽然我可以通过在每个结果的循环中运行一个查询来做到这一点,从activitylog中选择activity,其中userid=$foo

我已经很好地寻找了一个类似的问题,但毫无乐趣。我认为我的问题的答案是基于不同的、群体的和联合的,但不能以任何有意义的方式把它们放在一起

我有两张桌子:

样本数据:

两个表中出现用户名还有另一个不相关但有效的原因

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

虽然我可以通过在每个结果的循环中运行一个查询来做到这一点,从activitylog中选择activity,其中userid=$foo ORDER by id DESC,限制为0,1-我宁愿在一段干净的代码中运行它,因为用户数可能在50-100之间,这对我来说太多查询了


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

您需要一个由两部分组成的查询:一部分是获取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
)

续。从评论中的讨论

此查询将为您获取下一个要查找的解决方案集

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

感谢您的快速回复,但是您上面列出的代码只返回一个结果。。。具有最高/最新activitylog.idit的用户不应。子查询将返回activity表中每个用户的最后一个id。@MarcB ActivityLog没有username列,您可能应该将group by column替换为userid/usernamedisp。也许这就是导致这种意外行为的原因。啊,是的,没错。应该是userid。谢谢。谢谢@SoulTrain,你的调整让Marc B的代码工作得很好。更进一步说,如果有第四个用户的users.id为“4”,但该用户在activitylog表中还没有任何外观,那么是否可能在查询中使用一些空白字段返回这些用户?
User, Username  , Last Activity 
   1, Joe Bloggs, logged out 
   2, Jane Doe  , visited about us page
   3, John Smith, logged out
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