我有这个查询(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,而且还在增长。在这里,性能对我很重要。
如何解决这个问题?
您的查询可以简化为:
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)
.
归档时间: |
|
查看次数: |
68348 次 |
最近记录: |