我正在尝试使用单个select语句来获取报告,该语句连接到多个表并计算项目的出现次数。
问题是我加入的表可能包含也可能不包含数据,而我加入的表有大量数据集。
我的问题的简化示例是:
item
-----------------
| id | name |
-----------------
| 1 | item 1 |
| 2 | item 2 |
| 3 | item 3 |
| 4 | item 4 |
| 5 | item 5 |
| 6 | item 6 |
| 7 | item 7 |
| 8 | item 8 |
| 9 | item 9 |
-----------------
opened
----------------
| id | item_id |
----------------
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 3 |
| 5 | 2 |
----------------
closed
----------------
| id | item_id |
----------------
| 1 | 2 |
| 2 | 2 |
| 3 | 5 |
| 4 | 8 |
| 5 | 8 |
----------------
以下两个陈述都很慢。这是因为我的项目数据集有超过200万条记录。
select i.id, count(o.id) opened, count(c.id) closed
from item i
left join opened o on i.id= o.item_id
left join closed c on i.id= c.item_id
group by i.id;
select i.id, count(o.id) opened, count(c.id) closed
from item i
left join opened o on i.id= o.item_id
left join closed c on i.id= c.item_id
where o.item_id is not null or c.item_id is not null
group by i.id;
有没有人对如何提高速度有任何想法。我要找的结果应该是:
------------------------
| id | opened | closed |
------------------------
| 1 | 1 | 0 |
| 2 | 2 | 2 |
| 3 | 2 | 0 |
| 5 | 0 | 1 |
| 8 | 0 | 2 |
------------------------