mysql - 如何计算所有列中的数字或出现次数并使用 MySQL 列出它们?

标签 mysql sql database

我有一张看起来像这样的 table :

| A | B | C | ... | Z |  <- names of columns
-----------------------
| 1 | 0 | 1 | ... | 1 | 
| 0 | 1 | 1 | ... | 1 | 
| 1 | 1 | 1 | ... | 1 | 
| 0 | 1 | 1 | ... | 0 | 
| 1 | 0 | 1 | ... | 1 | 

我想将所有列中的所有 1 加起来并列出来。我怎样才能使用 MySQL 做到这一点?列数约为 80,如果可能的话我不想在 SQL 调用中列出它们。

我希望得到类似这样的回复:

A: 3
B: 3
C: 5
...
Z: 4

最佳答案

此表的设计方式使您描述的查询更加困难。

因为它们是相同的类型值,所以将许多列用于应该比较或一起计数的数据值称为重复组。这违反了数据库规范化规则。

存储此数据的更传统方式是超过 80 行,而不是 80 列。

CREATE TABLE mytable (
  id INT PRIMARY KEY,
  label CHAR(1) NOT NULL,
  value TINYINT NOT NULL
);

INSERT INTO mytable VALUES
('A', 1), ('B', 0), ('C', 1), ...

然后你可以像这样使用一个带有聚合函数的简单查询:

SELECT label, SUM(value)
FROM mytable
GROUP BY label;

有时候使用非规范化表设计(比如您当前的表)是值得的,但那时候您需要针对特定​​查询进行优化。使用非规范化设计时要小心,因为它们以牺牲您可能针对相同数据运行的所有其他查询为代价来优化一个查询。您要进行的查询是使用您当前拥有的非规范化设计变得更加困难的查询之一。

关于mysql - 如何计算所有列中的数字或出现次数并使用 MySQL 列出它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57749563/

相关文章:

php - MYSQL时间转换为PHP时间

sql - Google BigQuery WHERE NOT 列表包含字符串的意外行为

sql - 哪种是在Grails中查询数据库的有效方法? SQL,HQL或GORM?

database - 有谁知道一个很好的图书馆可以将一个人的名字映射到他或她的性别?

mysql - 请问我该如何优化这个mysql查询?

mysql - MySQL插入如果不存在查询线程安全吗

php - 在 PHP MySQL 中切换数据库连接

database - 通过 Excel 连接到 Oracle 数据库

php - 如何在多个用户输入后更新同一行?

sql - 使用 ms Access 中的查询从表中选择并插入到另一个表的不同类型的列