Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择数字范围的计数_Mysql - Fatal编程技术网

MySQL选择数字范围的计数

MySQL选择数字范围的计数,mysql,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 ; 步

我不知道该怎么做。这是我的桌子结构

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,包括计数等于零的地方。我希望它按顺序返回-类似这样的东西

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

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

如果您只创建一个表,列出所有有效步骤,可能会更简单,如下所示:

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 ;
CREATE TABLE steps (
  step int(2) NOT NULL PRIMARY KEY
);
INSERT INTO steps VALUES (1),(2),(3),(4),(5),(6);
然后,可以对其执行左联接以获取记录计数:

重要的部分是COUNTid:它只统计id列不为null的行。由于id被定义为非null列,这意味着它只对左连接创建的伪行进行折扣,否则这些步骤将没有记录

当然,如果您真的不想创建一个真正的表,甚至不想创建一个临时表,也可以使用ypercube的UNION ALL subselect技巧:


如果只创建一个表,列出所有有效步骤,可能会更简单,如下所示:

CREATE TABLE steps (
  step int(2) NOT NULL PRIMARY KEY
);
INSERT INTO steps VALUES (1),(2),(3),(4),(5),(6);
然后,可以对其执行左联接以获取记录计数:

重要的部分是COUNTid:它只统计id列不为null的行。由于id被定义为非null列,这意味着它只对左连接创建的伪行进行折扣,否则这些步骤将没有记录

当然,如果您真的不想创建一个真正的表,甚至不想创建一个临时表,也可以使用ypercube的UNION ALL subselect技巧:


错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用第10b行“AS s LEFT JOIN SELECT step,COUNT*AS n FROM my_table”的正确语法。这正是我所需要的。错误代码:1064。您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解使用第10b行“AS s LEFT JOIN SELECT step,COUNT*AS n FROM my_table”的正确语法。这是我所需要的。我认为在数据库中创建一个不可能在数量和值上都发生变化的数据表是一种很差的形式。在这一点上,我本质上是创建一个表,使select在另一个表上工作,而不是使用表来存放数据。对我来说,这表明我的方法有问题。你的后续建议与ypercube的非常接近。在派生表中选择“我的表”,而您没有选择。我无法确定哪种方法对我来说更明智。好吧,您可以将其设置为一个临时表,仅为该查询创建。现在不需要。你们两个给我的查询提供了我所需要的结果,而不必处理任何类型的附加表或过程。谢谢我认为在数据库中创建一个不可能在数量和值上都发生变化的数据表是一种很差的形式。在这一点上,我本质上是创建一个表,使select在另一个表上工作,而不是使用表来存放数据。对我来说,这表明我的方法有问题。你的后续建议与ypercube的非常接近。在派生表中选择“我的表”,而您没有选择。我无法确定哪种方法对我来说更明智。好吧,您可以将其设置为一个临时表,仅为该查询创建。现在不需要。你们两个给我的查询提供了我所需要的结果,而不必处理任何类型的附加表或过程。谢谢
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;