【问题标题】:MySQL Subquery to count multiple columns with GROUP BYMySQL 子查询使用 GROUP BY 计算多列
【发布时间】:2019-01-15 17:12:41
【问题描述】:

我的桌子

+---------+----------+---+
| 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

希望这能让我的问题更易于理解。

【问题讨论】:

  • 预期的结果是什么?为我们提供一个显示预期结果的文本格式表格。
  • 结果应该是 Mercedes 3 BMW 3 Ford 1 VW 2

标签: mysql group-by count


【解决方案1】:

为每个品牌的汽车使用一个列是设计表格的一种不好的方式,因为它会使处理数据变得复杂,就像您正在经历的那样。

不是每个品牌都有一个专栏;有一个列将每辆车链接到特定品牌:

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 |
+----------+----------+

【讨论】:

  • 哦,我错过了每个汽车品牌表设计的那一列。同意这是次优的。
  • SELECT name , count(*) from cars ... GROUP BY car_makes.make_id 不要太相信函数依赖来从主键中获取正确的数据,因为这是一个坏习惯。它仍然是一个无效的 ANSI GROUP BY SQL 查询。。跨度>
  • 是的,但那是不可能的。无法更改数据库布局。需要一个解决方案..
  • 我必须合并这些多个 UNION 查询... SELECT 'Mercedes' AS marke, COUNT(autos.id) FROM autos WHERE a1=1 UNION SELECT 'BMW' AS mark, COUNT(autos. id) FROM autos WHERE a2=1 UNION SELECT 'Ford' AS marke, COUNT(autos.id) FROM autos WHERE a3=1
【解决方案2】:

选择 SUM(a1) 作为“梅赛德斯”,sum(a2) 作为“宝马”,sum(a3) 作为“福特” 来自汽车

【讨论】:

  • 这不是问题的解决方案
  • @Aldee 也许您应该更具体地说明您希望输出的内容。
  • 我需要一个子查询来查询同一张表,统计单独列中的所有条目,标记为a1、a2、a3 -> 分组方式
猜你喜欢
  • 1970-01-01
  • 2012-09-23
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
  • 2011-09-06
  • 1970-01-01
相关资源
最近更新 更多