SQL查询以获取表中唯一组合的计数-MySQL

时间:2019-05-28 13:17:06

标签: mysql sql database

我有一个如下的映射表

c1  c2
--  --
1   1
1   1
1   2
1   3
1   3
2   1
2   2
2   3
3   1

,依此类推。该表具有单独的ID列(此处未显示)。 到目前为止,这是我的查询:

SELECT `c1`, `c2`, COUNT(*) AS `count_of_uniques` FROM `map_table` 
GROUP BY `c1`, `c2` 

我也尝试过这样的独特查询。

SELECT `c1`, `c2`, COUNT(DISTINCT `c1`, `c2`) AS `count_of_uniques` FROM `map_table`

预期结果是

c1  c2  count_of_uniques
--  --  ----------------
1   1   2
1   2   2
1   3   3
2   2   1
2   3   1

当由两个相似的数字组成的组合时,我当前的查询显示正确的输出,但是当我们具有1-2和2-1之类的内容时,查询没有正确的输出。

与众不同的结果仍然更少。

任何帮助将不胜感激。谢谢。

3 个答案:

答案 0 :(得分:3)

认为您可能会在处理一些组合而不是排列的内容,例如1, 22, 1应该被视为同一组合。如果是这种情况,则可以使用case表达式来确保c1始终是两个值中的较低者,而c2是两个值中的较高者。这会将相似的对组合在一起(因此,2, 1首先将颠倒为1, 2,然后与所有相似的结果组合在一起):

SELECT c1, c2, COUNT(*) AS `count_of_uniques` 
FROM (  SELECT CASE WHEN c1 > c2 THEN c2 ELSE c1 END AS c1, 
                CASE WHEN c1 > c2 THEN c1 ELSE c2 END AS c2
        FROM map_table) AS t
GROUP BY c1, c2

输出

c1      c2      count_of_uniques
-------------------------------
1       1       2
1       2       2
1       3       3
2       2       1
2       3       1

Example on DB Fiddle

答案 1 :(得分:0)

从map_table中选择C1,C2,Count(*)按C1,C2分组按C1排序

答案 2 :(得分:0)

您可以使用函数least()greatest()获取将要分组的对:

select 
  least(c1, c2) c1, 
  greatest(c1, c2) c2, 
  count(*) count_of_uniques
from map_table  
group by 
  least(c1, c2), 
  greatest(c1, c2)

请参见demo
结果:

| c1  | c2  | count_of_uniques |
| --- | --- | ---------------- |
| 1   | 1   | 2                |
| 1   | 2   | 2                |
| 1   | 3   | 3                |
| 2   | 2   | 1                |
| 2   | 3   | 1                |