MySQL选择一个数字范围的计数

时间:2012-12-27 20:41:19

标签: mysql

我不确定如何选择这个。这是我的表结构。

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  |
+----------+----------+

我希望我不需要为此定义程序。有没有一种简单的方法来获得我需要的东西?

2 个答案:

答案 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;