Php 使用最新条目从两个表中输出数据
我已经很好地寻找了一个类似的问题,但毫无乐趣。我认为我的问题的答案是基于不同的、群体的和联合的,但不能以任何有意义的方式把它们放在一起 我有两张桌子: 样本数据: 两个表中出现用户名还有另一个不相关但有效的原因 我希望输出按users.id和activitylog.username的顺序列出用户,最后只列出最新的activitylog.activity,如下所示: 虽然我可以通过在每个结果的循环中运行一个查询来做到这一点,从activitylog中选择activity,其中userid=$foo ORDER by id DESC,限制为0,1-我宁愿在一段干净的代码中运行它,因为用户数可能在50-100之间,这对我来说太多查询了Php 使用最新条目从两个表中输出数据,php,mysql,sql,group-by,union,Php,Mysql,Sql,Group By,Union,我已经很好地寻找了一个类似的问题,但毫无乐趣。我认为我的问题的答案是基于不同的、群体的和联合的,但不能以任何有意义的方式把它们放在一起 我有两张桌子: 样本数据: 两个表中出现用户名还有另一个不相关但有效的原因 我希望输出按users.id和activitylog.username的顺序列出用户,最后只列出最新的activitylog.activity,如下所示: 虽然我可以通过在每个结果的循环中运行一个查询来做到这一点,从activitylog中选择activity,其中userid=$foo
我相信这是可能的,但我似乎无法把它放在一起。您需要一个由两部分组成的查询:一部分是获取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