【发布时间】:2012-08-07 23:53:41
【问题描述】:
假设我有两个表,“users”和“audit”,并且每次用户状态更改时,触发器都会填充审计表。我正在尝试从两个表中进行选择,并获取具有关联的最新审核条目的用户条目(唯一)。假设表格具有以下字段:
用户:
- 身份证
- 用户名
- 电子邮件
- 状态
审核:
- id(只是一个任意的自动增量)
- user_id (fk)
- 新状态
- created_at(发生这种情况的日期/时间)
因此,对于每个用户条目,都有多个审核条目。
所以,最终我需要说出结果(斜体部分是审计结果,非斜体部分是 mysql 结果集中行的用户部分):
1, john, john@gmail.com, 10, 5, 1, 10, 2012-08-10-10:15:59
等等
现在,我能看到的唯一方法是进行复合选择,我在其中执行以下操作: SELECT U.*, (SELECT * FROM audit A2 where A2.id = max(A.id)) FROM users U left join audit A on (U.id = A.user_id);
问题是,如果您在用户中获得数千甚至数十万个结果,您将在数据库内部执行 n+1 次查询 - 这确实是低效的。
关于如何在不使用复合 SELECTS 的情况下将其编写为一条 SQL 语句的任何想法?
【问题讨论】: