2

我不确定如何进行此选择。这是我的表结构。

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 ;

step 列将包含一个介于 0 和 7 之间的整数。我正在尝试计算我的表中有多少条记录,范围从步骤 1 到 6。我需要整个范围 (1 - 6),包括 COUNT 等于 0 的地方。我希望它按顺序返回——像这样。

+----------+----------+
|   step   |     n    |
+----------+----------+
|   Step 1 |     100  |
+----------+----------+
|   Step 2 |     150  |
+----------+----------+
|   Step 3 |     135  |
+----------+----------+

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

4

2 回答 2

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 ;
于 2012-12-27T20:48:51.750 回答
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;
于 2012-12-27T21:07:10.253 回答