首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接两个表(一对多),并在第二个表中获得最新条目。

连接两个表(一对多),并在第二个表中获得最新条目。
EN

Stack Overflow用户
提问于 2012-08-10 16:31:10
回答 1查看 1.4K关注 0票数 3

假设我有两个表,“用户”和“审计”,并且每次用户的状态变化时,审计表都会被一个触发器填充。我试图从两个表中进行选择,并使用相关的最新审计条目获取用户条目(唯一)。假设表中有以下字段:

用户:

  • id
  • 用户名
  • 电子邮件
  • 状态

审计:

  • id (只是一个任意的自动增量)
  • user_id (fk)
  • new_status
  • created_at (发生这种情况的日期/时间)

因此,对于每个用户条目,都有多个审计条目.

因此,我最终需要说出结果(其中斜体部分是审计的结果,而非斜体部分是mysql结果集中行的用户部分):

1,john,john@gmail.com,10,5,1__,10,2012-08-10-10:15:59

现在,我能看到的唯一方法是做复合选择,其中我做的事情有:选择U*,(从审计A2中选择*,其中A2.id = max(A.id)),从你离开join审计A on (U.id = A.user_id);

问题是,如果您在用户中有数千个或几十万个结果,那么您将在DB内部执行n+1查询--这是非常低效率的。

对于如何在不使用复合选择的情况下将其写成一个SQL语句,有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-10 16:34:13

我假设总是有一个相应的审计条目,因此使用了内部联接。另外,假设同一用户没有两个具有相同created_at日期的审计条目。

代码语言:javascript
复制
select u.id, u.username, u.email, u.status, 
    a.id, a.new_status, a.created_at
from users u
inner join (
    select user_id, max(created_at) as MaxCreated
    from audit
    group by user_id
) am on u.id = am.user_id
inner join audit a on am.user_id = a.user_id and am.MaxCreated = a.created_at
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11905728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档