3

我有一个简单的 MySQL 语句:

SELECT q1, COUNT(q1) FROM results WHERE q1 IN ('1','2','3');

目前只有 1 和 3 的结果 - 结果是:

1 = 6
3 = 7

但我需要的是让 MySQL 带回 1,2 和 3 的结果,即使 2 没有数据,如下所示:

1 = 6
2 = 0
3 = 7

有任何想法吗?

4

3 回答 3

3

这很棘手,因为没有行与您的值匹配 (2),它们无法计数。

我会通过创建一个临时表来解决这个问题,其中包含我想要计算的值列表:

CREATE TEMPORARY TABLE q ( q1 INT PRIMARY KEY );
INSERT INTO q (q1) VALUES (1), (2), (3);

然后对结果表执行 OUTER JOIN:

SELECT q.q1, COALESCE(COUNT(*), 0) AS count
FROM q LEFT OUTER JOIN results USING (q1)
GROUP BY q.q1;

这样每个值都将成为最终结果集的一部分,即使它没有匹配的行。


来自@Mike Christensen 的重新评论:

MySQL 不支持 CTE,尽管它早在 2006 年就被要求:http ://bugs.mysql.com/bug.php?id=16244

你可以对派生表做同样的事情:

SELECT q.q1, COALESCE(COUNT(*), 0) AS count
FROM (SELECT 1 AS q1 UNION ALL SELECT 2 UNION ALL SELECT 3) AS q 
LEFT OUTER JOIN results USING (q1)
GROUP BY q.q1;

但这无论如何都会创建一个临时表。

于 2013-11-04T22:00:48.300 回答
0

通常,您无法查询不存在的内容。因此,您必须为其创建数据。使用 union 添加那些缺失的数据值。

select q1, COUNT(*) 
from results 
where q1 in ('1','2','3')
group by q1
union
select q1, 0
from (
  select '1' as q1
  union 
  select '2'
  union 
  select '3'
) as q
where q1 not in (
  select q1
  from results
)
于 2013-11-04T21:51:48.973 回答
0

SQL 查询实际上并没有办法引用IN子句中的值。我认为您必须将其分解为每个值的一个查询。就像是:

SELECT 1 as q1, COUNT(1) FROM results WHERE q1 = '1'
UNION ALL
SELECT 2 as q1, COUNT(1) FROM results WHERE q1 = '2'
UNION ALL
SELECT 3 as q1, COUNT(1) FROM results WHERE q1 = '3'

小提琴

注意:如果您的子句中有很多值,您IN最好以假定缺失值为零的方式编写代码。

于 2013-11-04T21:41:41.403 回答