我不确定如何选择这个。这是我的表结构。
CREATE TABLE `my_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`step` int(2) NOT NULL DEFAULT '0',
`title` varchar(200) NOT NULL,
`description` text NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;
步骤列将包含一个介于0和7之间的整数。我正在尝试计算我的表中有多少记录,包括步骤1到6的范围。我需要整个范围(1 - 6),包括COUNT的位置等于零。我希望它按顺序返回 - 就像这样。
+----------+----------+
| step | n |
+----------+----------+
| Step 1 | 100 |
+----------+----------+
| Step 2 | 150 |
+----------+----------+
| Step 3 | 135 |
+----------+----------+
我希望我不需要为此定义程序。有没有一种简单的方法来获得我需要的东西?
答案 0 :(得分:3)
SELECT
s.step
, COALESCE(t.n, 0) AS n
FROM
( SELECT 1 AS step UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6
) AS s
LEFT JOIN
( SELECT step
, COUNT(*) AS n
FROM my_table
GROUP BY step
) AS t
ON t.step = s.step
ORDER BY
s.step ;
答案 1 :(得分:1)
如果您刚刚创建了一个列出所有有效步骤的表格,可能会更简单,例如:
CREATE TABLE steps (
step int(2) NOT NULL PRIMARY KEY
);
INSERT INTO steps VALUES (1),(2),(3),(4),(5),(6);
然后你可以对它进行LEFT JOIN
以获得记录计数(SQLize):
SELECT
step, COUNT(id) AS n
FROM
steps LEFT JOIN my_table USING (step)
GROUP BY step;
重要的部分是COUNT(id)
:它只计算id
列不为空的行。由于id
被定义为非空列,这意味着它只会折叠由左连接创建的虚拟行,以获取原本没有记录的步骤。
当然,如果你真的不想创建一个真实的表(甚至是一个临时的表),你也可以用ypercube的UNION ALL
子选择技巧(SQLize)来做到这一点:
SELECT step, COUNT(id) AS n
FROM
( SELECT 1 AS step UNION ALL
SELECT 2 UNION ALL
SELECT 3 UNION ALL
SELECT 4 UNION ALL
SELECT 5 UNION ALL
SELECT 6
) AS steps
LEFT JOIN my_table USING (step)
GROUP BY step;