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 |