根据具有多个连接的最新日期选择行

sti*_*tiq 8 mysql group-by

我有这个查询(SQLFiddle):

SELECT
c.name,
a.user_id,
a.status_id,
a.title,
a.rtime,
u.user_name,
s.status_name

FROM company c

LEFT JOIN action a ON a.company_id=c.id
LEFT JOIN user u ON u.id=a.user_id
LEFT JOIN status s ON s.id=a.status_id



WHERE u.user_name='Morgan'

-- WHERE c.name='Fiddle'

GROUP BY c.id

HAVING a.rtime IS NULL OR a.rtime = (
 SELECT max(rtime)
 FROM action a2
 WHERE deleted IS NULL
 AND a2.company_id = c.id
 )
Run Code Online (Sandbox Code Playgroud)

问题一

我想列出所有公司,并显示他们上次对公司采取行动的用户和状态。同时显示没有采取任何行动的公司。

问题二

我还需要能够按名称搜索用户,从而选择该用户最近进行过活动的所有公司。查询是从表单中生成的,因此我可以注入变量。


我目前无法更改数据库 SCHEMA,但对未来迁移的建议非常有用。

我试过将它绑定在一起,INNER JOIN ( SELECT.. ) t ON但我无法理解它。

我也尝试过这里这里这里的方法 ,但我无法找到最新活动的人。

MySQL 版本:5.5.16。company 表大约有 1mill 行,action 表有 70K,而且还在增长。在这里,性能对我很重要。

如何解决这个问题?

ype*_*eᵀᴹ 8

您的查询可以简化为:

SELECT
    c.id,
    c.name,
    a.rtime,
    s.status_name,
    u.user_name
FROM company c
    LEFT JOIN
      ( SELECT 
            company_id,
            MAX(rtime) AS maxdate
        FROM action
        WHERE deleted IS NULL
        GROUP BY company_id
      ) AS x ON x.company_id = c.id
    LEFT JOIN action a ON  a.deleted IS NULL
                       AND a.company_id = x.company_id 
                       AND a.rtime = x.maxdate 
    LEFT JOIN user u ON u.id = a.user_id
    LEFT JOIN status s ON s.id = a.status_id
WHERE 
    c.name LIKE 'Company%' ;
Run Code Online (Sandbox Code Playgroud)

索引(deleted, company_id, rtime)将使派生表子查询有效。我想您已经在用于连接的列和Company (name).

SQL-小提琴