在我的数据库中,我有一个包含这些值的表:
column_a,column_b
1,2
3,4
2,1
4,3
3,1
5,6
1,4
1,3
我能够知道特定值和任何其他值之间有多少次匹配。取值“ 1”:
SELECT COUNT(*) FROM (SELECT * FROM `table` WHERE `column_a` = 1) as T1
JOIN (SELECT * FROM `table` WHERE `column_b` = 1) as T2
WHERE T1.`column_b` = T2.`column_a`
[结果将为2,因为我们有1,2
,2,1
,1,3
和3,1
-> 1匹配2和3。
现在,我想知道比赛的总数。此处为3(因为3,4
和4,3
)。
有人有想法吗?
谢谢
解决此问题的一种方法是计算找到匹配对的所有情况,但限制匹配,以便仅选择column_a
大于column_b
的对以避免重复:
SELECT COUNT(*)
FROM `table` t1
WHERE EXISTS (
SELECT *
FROM `table` t2
WHERE t2.column_b = t1.column_a AND t2.column_a = t1.column_b
AND t2.column_a < t1.column_a
)
输出:
3
您也可以使用least()
和greatest()
功能:
SELECT COUNT(*)
FROM (SELECT COUNT(*)
FROM `table` t1
GROUP BY LEAST(column_a, column_B), GREATEST(column_a, column_B)
HAVING COUNT(*) > 1
) t;
这里是demo。
这里是一种方法:
select count(distinct case when a = 1 then b else a end)
from t
where 1 in (a, b);
Here是db <>小提琴。