右连接查询返回不匹配的值

时间:2015-11-02 17:47:30

标签: mysql optimization

我正在尝试优化查询,并将其归结为类似的内容,

select a.* from 
(select id, count(oid) as cnt from stuff1 s1 inner join stuff2 s2 on s1.id=s2.id group by id) as a
right join
(select id,'0' as cnt from stuff2) as b
on a.id = b.id

基本上,目标是获得每个oid的计数,其中包括0计数的那些。我之前有一个查询工作正常,但执行时间为30秒。我希望用这个优化旧查询,但我从表b获得NULL值。我需要表b中的值显示id和0.任何帮助都将非常感激。

数据集的一个例子可以是,

Stuff1

| oid | id |
|---- |----|
| 1   | 1  |
| 2   | 1  |
| 3   | 2  |
| 4   | 3  |

Stuff2

| id |
|----|
| 1  |
| 2  |
| 3  |
| 4  |
| 5  |
| 6  |
| 7  |

查询应该生成

| id | cnt |
|----|-----|
| 1  | 2   |
| 2  | 1   |
| 3  | 1   |
| 4  | 0   |
| 5  | 0   |
| 6  | 0   |
| 7  | 0   |

1 个答案:

答案 0 :(得分:2)

您的查询在语法上不正确(oid可能未定义; id中的select不明确。但是,我怀疑你想要一个简单的left join

select s2.id, count(s1.id) as cnt
from stuff2 s2 left join
     stuff1 s1
     on s1.id = s2.id
group by s2.id;