加入2个表(一对多)并在第二个表中获得最新条目

时间:2012-08-10 16:31:11

标签: mysql sql database

假设我有两个表,“users”和“audit”,每次用户状态发生变化时,触发器都会填充审计表。我正在尝试从两个表中进行选择,并获得具有关联的最新审计条目的用户条目(唯一)。假设表格包含以下字段:

用户:

  • 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

现在,我能看到的唯一方法是复合选择,我做的事情如下: SELECT U. *,(SELECT * FROM audit A2,其中A2.id = max(A.id))FROM users U left join audit A on(U.id = A.user_id);

问题是,如果你在用户中有数千甚至数十万个结果,你将在数据库内部进行n + 1次查询 - 这实在是效率低下。

关于如何在不使用复合SELECTS的情况下将其作为一个SQL语句编写的任何想法?

1 个答案:

答案 0 :(得分:5)

我假设总是有相应的审核条目,因此使用了INNER JOIN。此外,假设同一用户没有两个具有相同created_at日期的审核条目。

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