Как считать разные столбцы в SQL, игнорируя порядок столбцов - PullRequest
2 голосов
/ 05 ноября 2019

У меня есть такая таблица:


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

Не имеет значения, возвращается ли результат в одном столбце или двух столбцах.

Спасибо заавансовый

Ответы [ 2 ]

5 голосов
/ 05 ноября 2019

Используйте 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;
0 голосов
/ 05 ноября 2019

Вот моя отсталая версия, но никаких дополнительных знаний 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
...