我需要为每个用户角色获取报告计数,但我的SQL查询非常慢(良好服务器上40秒)。我的SQL查询:
SELECT `auth_assignment`.`item_name`, COUNT(*) as count
FROM `report`
LEFT JOIN `company` ON company.id = report.company_id
LEFT JOIN `auth_assignment`
ON auth_assignment.user_id = company.user_id
GROUP BY `auth_assignment`.`item_name`
ORDER BY `count`
auth_assignment
。item_name
是角色类型。
auth_assignment
有~23k行。
company
~11k行。
reports
~12k行(一家公司可以有很多报告)。
report
。id
和company
。id
,具有约束力
答案 0 :(得分:0)
首先,您要汇总left join
中第三个表中的列。我猜你不想要NULL
这个值,所以请使用inner join
或更改表格的顺序。
表别名使查询更容易编写和阅读:
SELECT aa.item_name, COUNT(*) as cnt
FROM report r JOIN
company c
ON c.id = r.company_id JOIN
auth_assignment aa
ON aa.user_id = c.user_id
GROUP BY aa.item_name
ORDER BY cnt;
假设表的连接是正确的,那么您只想确保有索引。这些应该放在用于join
的列上:company(id, user_id)
,auth_assignment(user_id, item_name)
。