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 上标记其他一些列以便能够在之后删除这些行。因此,我的导入脚本的步骤将更改为:
但是,我正在寻找一种更清洁的方法来达到预期的结果。如果可能,单个查询,没有一堆 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)
它可以返回这些过滤后的值。
如果真的存在/可能的话,我真的很想学习这样的命令。
再次,非常感谢您!
好吧...我想我找到了!谢谢你们!!!我接受我自己的答案。
我同意@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 列,并标有匹配类型。另外,由于我们对类型值进行了标准化(并且我们肯定不会更改它),从而为其提供了名称和描述,因此我现在可以使用类型名称作为列标签,而不是加入到带有类型信息的表来选择结果中的第三列(实际上,这并不重要,因为它是基于某些标准的导入脚本)。
非常感谢大家的帮助!