【问题标题】:How to count different columns in SQL ignoring the column order如何在忽略列顺序的情况下计算 SQL 中的不同列
【发布时间】:2019-11-05 10:50:27
【问题描述】:

我有一张这样的桌子:


home_city     away_city
-----------------------

Valencia      Madrid        
Barcelona     Madrid
Madrid        Valencia
Alicante      Castellon
Madrid        Valencia
Castellon     Alicante
Valencia      Madrid

我想计算每个不同组合的行数,但忽略它是 home_city 还是 away_city 我的意思是,通常我会做一个这样的查询

SELECT home_city, away_city, COUNT(*) as count_cities
FROM my_table
GROUP BY home_city, away_city

它会返回以下结果:

home_city     away_city     count_cities
----------------------------------------

Valencia      Madrid        2
Barcelona     Madrid        1        
Madrid        Valencia      2
Alicante      Castellon     1
Castellon     Alicante      1

但我真正想要的是查询忽略列并返回类似的内容:

home_city     away_city     count_cities
----------------------------------------

Valencia      Madrid        4
Barcelona     Madrid        1        
Alicante      Castellon     2

结果是在一列还是两列中返回都没有关系。

提前致谢

【问题讨论】:

  • 切换 home_city > away_city 的列,在 group by 之前。
  • 在所需结果集中将 home_city 和 away_city 作为标题是没有意义的。

标签: mysql sql count


【解决方案1】:

使用least()greatest()

SELECT LEAST(home_city, away_city) as city1,
       GREATEST(home_city, away_city) as city2,
       COUNT(*) as count_cities
FROM my_table
GROUP BY LEAST(home_city, away_city),
         GREATEST(home_city, away_city);

MySQL 允许在 GROUP BY 中使用别名,因此您可以将其简化为:

SELECT LEAST(home_city, away_city) as city1,
       GREATEST(home_city, away_city) as city2,
       COUNT(*) as count_cities
FROM my_table
GROUP BY city1, city2;

【讨论】:

    【解决方案2】:

    这是我的蹩脚版本,但不需要高级 SQL 知识;)

    SELECT CASE WHEN home_city < away_city THEN CONCAT(home_city, ',', away_city) ELSE CONCAT(away_city, ',', home_city) END as cities, COUNT(*) as count
    FROM X2
    GROUP BY CASE WHEN home_city < away_city THEN CONCAT(home_city, ',', away_city) ELSE CONCAT(away_city, ',', home_city) END;
    
    --drop table X2;
    create table X2 
    (home_city varchar(255), away_city varchar(255));
    
    
    insert into X2 values ('Valencia','Madrid');        
    insert into X2 values ('Barcelona','Madrid');
    insert into X2 values ('Madrid','Valencia');
    insert into X2 values ('Alicante','Castellon');
    insert into X2 values ('Madrid','Valencia');
    insert into X2 values ('Castellon','Alicante');
    insert into X2 values ('Valencia','Madrid');
    
    SELECT CASE WHEN home_city < away_city THEN CONCAT(home_city, ',', away_city) ELSE CONCAT(away_city, ',', home_city) END as cities, COUNT(*) as count
    FROM X2
    GROUP BY CASE WHEN home_city < away_city THEN CONCAT(home_city, ',', away_city) ELSE CONCAT(away_city, ',', home_city) END;
    
    cities  count
    Alicante,Castellon  2
    Barcelona,Madrid    1
    Madrid,Valencia 4
    

    【讨论】:

    • 另一种解决方案似乎更简单
    猜你喜欢
    • 2016-08-06
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2013-04-05
    • 2017-01-06
    • 2010-10-12
    • 1970-01-01
    相关资源
    最近更新 更多