mysql - MySQL 子查询使用 GROUP BY 计算多列
问题描述
我的桌子
+---------+----------+---+
| id | a1 | a2 | a3 |
+---------+----+----+----+
| 1 | 1 | 0 | 0 |
| 2 | 0 | 1 | 0 |
| 3 | 1 | 1 | 1 |
| 4 | 1 | 1 | 0 |
+---------+----+----+----+
我想要的结果:梅赛德斯 3 宝马 3 福特 1 大众 2
查询我试过..
SELECT
IF(a1=1,'Mercedes',
IF(a2=1,'BMW',
IF(a3=1,'Ford',
IF(a4=1,'VW',
'NO')))) AS marke,
COUNT(autos.id) AS anzahl FROM autos
WHERE autos.land=de GROUP BY marke ORDER BY anzahl DESC
我得到了想要的结果,但只有第一行计数正确。如何添加子查询以再次查询同一个表,显示每个字段的正确计数(a1、a2、a3)
还有什么死我尝试:以下子查询也失败了!
SELECT
IF(a1=1,'Mercedes',
IF(a2=1,'BMW',
IF(a3=1,'Ford',
IF(a4=1,'VW',
'NO')))) AS marke,
IF(a1=1,(SELECT COUNT( autos.id) FROM marke WHERE a1=1),
IF(a2=1,(SELECT COUNT( autos.id) FROM marke WHERE a2=1),
IF(a3=1,(SELECT COUNT( autos.id) FROM marke WHERE a3=1),
IF(a4=1,(SELECT COUNT( autos.id) FROM marke WHERE a4=1),
'NO')))) AS anzahl,
FROM autos
WHERE autos.land=de GROUP BY marke ORDER BY anzahl DESC
希望这使我的问题更容易理解我试图达到的目标。
解决方案
为每个品牌的汽车使用一列是设计表格的一种不好的方式,因为它会使处理数据变得复杂,就像您正在经历的那样。
不是每个品牌都有一个专栏;有一个列将每辆车链接到特定品牌:
CREATE TABLE car_makes (
make_id bigint unsigned not null auto_increment primary key,
name varchar(64)
);
CREATE TABLE cars (
car_id bigint unsigned not null auto_increment primary key,
make_id bigint
);
INSERT INTO car_makes (name) VALUES ('Ford'), ('VW'), ('BMW'), ('Mercedes');
/* now let's create some cars that match your desired results */
INSERT INTO cars (make_id) SELECT make_id FROM car_makes;
INSERT INTO cars (make_id) SELECT make_id FROM car_makes WHERE name IN('VW', 'Mercedes', 'BMW');
INSERT INTO cars (make_id) SELECT make_id FROM car_makes WHERE name IN( 'Mercedes', 'BMW');
现在您可以简单地按您想要的方式进行分组:
SELECT name , count(*) from cars
JOIN car_makes ON ( car_makes.make_id = cars.make_id)
GROUP BY car_makes.make_id;
您可以看到这如何有助于使数据更易于管理,并且还使查询更高效。
+----------+----------+
| name | count(*) |
+----------+----------+
| Ford | 1 |
| VW | 2 |
| BMW | 3 |
| Mercedes | 3 |
+----------+----------+
推荐阅读
- java - 使用 Java EE 依赖项在 Spring 中创建名为“entityManagerFactory”的 bean 时出错
- javascript - 引用一个全局变量,而封装的变量可用
- c++ - 在 natvis 中使用 std::type_info 进行强制转换
- kotlin-native - 如何为 Kotlin/Native 启用“宽松”内存模型模式?
- java - 以编程方式将地图片段添加到容器将其添加到底部
- c# - 我正在尝试使用统一制作游戏,但我的 Jump 功能不起作用
- python - Python-ValueError:环境变量超过 32767 个字符
- javascript - 将 json 一行解析为 html
- python - 填充新数据框的单元格,而不会丢失前一个数据框的某些列
- node.js - Node.JS 集群模块 - 多服务器集群?