两个选择查询,计数到一个查询

时间:2014-05-20 22:20:58

标签: mysql sql select join

我有两个查询来计算数据:

SELECT x.Id, COUNT( DISTINCT y.Id )
FROM X x
INNER JOIN Y y ON x.Id = y.otherId


SELECT x.Id, COUNT( DISTINCT z.Id )
FROM X x
INNER JOIN Z z ON x.Id = z.otherId

执行分隔时,两个查询都返回正确的值。

但我想将这些查询合并到一个查询中:

SELECT x.Id, COUNT( DISTINCT y.Id ), COUNT( DISTINCT z.Id )
FROM X x
INNER JOIN Y y ON x.Id = y.otherId
INNER JOIN Z z ON x.Id = z.otherId 

当我这样做时,与单独执行的查询相比,这两个计数都是错误的。

为什么会这样,我真的很困惑。解决方案可能很简单,但我现在真的没有任何线索。

2 个答案:

答案 0 :(得分:6)

inner join过滤掉两个表中不匹配的值。要做你想做的事,请使用left outer join

SELECT x.Id, COUNT( DISTINCT y.Id ), COUNT( DISTINCT z.Id )
FROM X x
LEFT JOIN Y y ON x.Id = y.otherId
LEFT JOIN Z z ON x.Id = z.otherId ;

我提醒我不要使用这种方法,因为它产生的中间结果是两个表中匹配值数量的笛卡尔积(对于给定的x.ID值)。相反,您可以使用子查询。以下是使用嵌套子查询的示例

select x.id,
       (select count(distinct y.id) from y where x.id = y.otherId),
       (select count(distinct z.id) from z where x.id = z.otherid)
from x;

答案 1 :(得分:0)

INNER JOIN就像一个十字路口。第一个查询是计算表y.idy.otherId的所有不同x,但z中没有必要。第二个是z.idz.otherId位于x,但不一定位于y。第三个合并查询将全部为y.idy.otherId位于x和z.otherId中,反之亦然。

如果您想要两个计数,您可以随时将它们与UNION放在一起,但它会将您的两个答案放在不同的行中,而不是不同的列。