mysql group by 2列的唯一组合

时间:2015-11-11 17:53:30

标签: mysql sql group-by

我有一张桌子:Employee

columns:
1. id
2. name
3. city1
4. city2

我希望GROUP BY city1city2的组合,以便{...}

  • 有city1的员工:'Bangalore'和city2:'Chennai'
  • 以及另一名拥有city1的员工:'Chennai'和city2:'Bangalore'
完成GROUP BY后,

会出现在一个组中。

帮我构建这个sql。

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用least()greatest()

select least(city1, city2) as city1, greatest(city1, city2) as city2, count(*)
from employees
group by least(city1, city2), greatest(city1, city2);

如果您有NULL值,逻辑会稍微复杂一些。问题没有说明NULL值。

注意:

编辑此答案时使用:

group by city1, city2

虽然技术上正确,但我删除了编辑有两个原因:

  1. city1city2不明确,因为它们都是数据和列别名中列的名称。
  2. 并非所有数据库都支持group by子句中的列别名。
  3. 首先是主要原因。如果列别名与表中的名称不同,那么替代配方就可以了。否则,我认为代码混乱,因此可维护性较差,更容易出错。

答案 1 :(得分:1)

您可以使用CASE WHEN;

为您的城市建立一个有序密钥并对其进行分组
SELECT 
  CityKey,
  Id, 
  Name,
  count(CityKey)
FROM
  (SELECT 
    CASE WHEN City1 > City2 THEN Concat(City1,City2)
         WHEN City1 <= City2 THEN Concat(City2,City1)
    END AS CityKey,
    Sample.City1,
    Sample.City2,
    Id,
    name
  FROM SAMPLE) WithKeys
GROUP BY CityKey, Id, Name;

答案 2 :(得分:1)

 SELECT city,  count(*)
 FROM 
   (
    SELECT e.*,
           if(e.city1 < e.city2, 
              concat(city1,'-', city2),
              concat(city2,'-', city1)) as city
    FROM employee
   ) T
 GROUP BY city