SQL group by 和 count 固定列值

Fel*_*ira 5 sql group-by count

我在 SQL(MySQL) 中的数据导入脚本中遇到问题,我需要按类型对行进行分组以计算每种类型有多少行。到目前为止,这不是一个真正的问题,因为我知道我可以做到:

SELECT 
  data.type, 
  COUNT(data.type) 
FROM data 
GROUP BY data.type;
Run Code Online (Sandbox Code Playgroud)

所以,通过这样做,我得到了结果:

 --------------- --------------------- 
| 类型 | 计数(数据类型)|
|--------------|----------------------------|
| 0 | 1 |
| 1 | 46 |
| 2 | 35 |
| 3 | 第423话
| 4 | 64 |
| 5 | 36 |
| 9 | 1 |
 --------------- ---------------------

我知道在类型列中,值总是在 0 到 9 的范围内,就像上面的结果一样。因此,我不仅要列出表内容中的现有值,还要列出缺失的类型值,并将它们的 COUNT 值设置为 0。

根据上述查询结果,预期结果为:

 --------------- --------------------- 
| 类型 | 计数(数据类型)|
|--------------|----------------------------|
| 0 | 1 |
| 1 | 46 |
| 2 | 35 |
| 3 | 第423话
| 4 | 64 |
| 5 | 36 |
| 6 | 0 |
| 7 | 0 |
| 8 | 0 |
| 9 | 1 |
 --------------- --------------------- 

我可以在 GROUP/COUNT-1 表格内容之前巧妙地插入每种类型的一行,在 INSERT 上标记其他一些列以便能够在之后删除这些行。因此,我的导入脚本的步骤将更改为:

  1. 截断表;(如果表中有旧数据,我无法安全地导入新内容)
  2. 插入“控制”行;
  3. 将数据文件加载到表中
  4. GROUP/COUNT-1表格内容;
  5. 删除“控制”行;(所以我仍然可以使用表格内容)
  6. 做任何其他工作

但是,我正在寻找一种更清洁的方法来达到预期的结果。如果可能,单个查询,没有一堆 JOIN。

我将不胜感激任何建议或建议。非常感谢!

编辑

我要感谢有关 CREATE a table to store all types to JOIN 它的答案。它确实解决了问题。我的方法也解决了它,但它是否像您一样存储类型。

所以,我有“另一个”问题,只是根据收到的答案和我想要的范围进行澄清......是否有可能使用一些不会创建新表和/或插入这些类型的 MySQL 命令来达到预期结果?

我没有看到任何问题,实际上,在解决我存储类型的问题时......我只想找到一个简化的命令......类似于“最佳实践”......某种过滤器......作为我可以运行:

GROUP BY data.type(0,1,2,3,4,5,6,7,8,9)
Run Code Online (Sandbox Code Playgroud)

它可以返回这些过滤后的值。

如果真的存在/可能的话,我真的很想学习这样的命令。

再次,非常感谢您!

Fel*_*ira 0

好吧...我想我找到了!谢谢你们!!!我接受我自己的答案。

我同意@GordonLinoff 的评论,即最佳实践是指存储类型值并描述它们,这样您就可以保持简洁/易于理解的数据库和查询。

但是,据我所知,如果您有一些可能是不相关信息的数据,最好以其他方式处理它而不是存储它。

所以,我开发了这个查询:

SELECT 
  SUM(IF(data.type = 0, 1, 0)) AS `0`, 
  SUM(IF(data.type = 1, 1, 0)) AS `1`, 
  SUM(IF(data.type = 2, 1, 0)) AS `2`, 
  SUM(IF(data.type = 3, 1, 0)) AS `3`, 
  SUM(IF(data.type = 4, 1, 0)) AS `4`, 
  SUM(IF(data.type = 5, 1, 0)) AS `5`, 
  SUM(IF(data.type = 6, 1, 0)) AS `6`, 
  SUM(IF(data.type = 7, 1, 0)) AS `7`, 
  SUM(IF(data.type = 8, 1, 0)) AS `8`, 
  SUM(IF(data.type = 9, 1, 0)) AS `9` 
FROM data;
Run Code Online (Sandbox Code Playgroud)

不是一个更快、优化和美观的查询,但对于我将管理的数据大小(每次导入少于 100.000 行),它“手动”执行 GROUP/COUNT 作业,在通用开发人员计算机中运行 0.13 秒。

它与我的预期结果的不同之处仅在于选择行和列的方式 - 而不是 10 行 2 列,我有 1 行 10 列,并标有匹配类型。另外,由于我们对类型值进行了标准化(并且我们肯定不会更改它),从而为其提供了名称和描述,因此我现在可以使用类型名称作为列标签,而不是加入到带有类型信息的表来选择结果中的第三列(实际上,这并不重要,因为它是基于某些标准的导入脚本)。

非常感谢大家的帮助!