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

SQL查询以获取表中唯一组合的计数-MySql,mysql,sql,database,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(DISTIN

我有一个如下所示的映射表

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的数据时,查询没有正确的输出

distinct显示的结果更少

非常感谢您的帮助。谢谢。

从地图表格组中按C1选择C1,C2,计数(*),按C1排序C2

我想您可能想要的是处理组合而不是排列的东西,即
1,2
2,1
应被视为相同的组合。如果是这种情况,您可以使用case表达式确保c1始终是两个值中的较低值,c2始终是两个值中的较高值。这将相似的对分组在一起(因此
2,1
将首先反转为
1,2
,然后与所有相似的结果分组):

输出

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

您可以使用函数和获取要分组的对:

select 
  least(c1, c2) c1, 
  greatest(c1, c2) c2, 
  count(*) count_of_uniques
from map_table  
group by 
  least(c1, c2), 
  greatest(c1, c2)
请参阅。
结果:


您的预期输出是第一个查询的实际输出。您是否发布了错误的预期输出?是SQL还是MySQL?“是SQL还是MySQL?”@sir我自己如果您是这么想的话,该标签与本网站上的SQL Server(MSSQL)无关。@raymond nijl和我站在更正位置then@GarethD对不起,数据错了。我试图使事情简单化,但失去了很多细节。我认为这是最好的答案。问题:使用
IF
函数和使用
CASE
语句之间有什么效率更高?问题显示的是一个CASE表达式,而不是CASE语句(区别通常是我很迂腐,但在MySQL中它更重要,因为MySQL同时有a和a)。尽管如此,也没有最终的答案。实际上,我希望任何性能差异都可以忽略不计,可以假定它们是相等的。我比MySQL更了解SQL Server,并且我知道如果在编译过程中将()(
IIF()
)重写为CASE表达式,那么SQL Server的性能差异绝对为零。我希望MySQL能够提前执行类似的操作,以便在内部两者都执行完全相同的操作。
select 
  least(c1, c2) c1, 
  greatest(c1, c2) c2, 
  count(*) count_of_uniques
from map_table  
group by 
  least(c1, c2), 
  greatest(c1, c2)
| c1  | c2  | count_of_uniques |
| --- | --- | ---------------- |
| 1   | 1   | 2                |
| 1   | 2   | 2                |
| 1   | 3   | 3                |
| 2   | 2   | 1                |
| 2   | 3   | 1                |