我有一个表格,其中有一列显示成对的学生,例如'Anna-Bob','Anna-Charlie','Bob-Dan','Bob-Anna','Charlie-Anna'...
我想计算每对学生以任意顺序出现在该列中的次数。例如,对于“ Anna-Bob”对,我将计算那些具有“ Anna-Bob”或“ Bob-Anna”的对象。
Table
Id Pair
1 Anna-Bob
2 Anna-Charlie
3 Bob-Dan
4 Bob-Anna
5 Charlie-Anna
The expected result should be
Pair Count
Anna-Bob 2
Anna-Charlie 2
Bob-Dan 1
答案 0 :(得分:5)
您应该认真考虑规范化数据模型,并将两个名称中的每个名称存储在单独的列中。话虽如此,您可以使用SUBSTRING_INDEX
解决此问题:
SELECT
CONCAT(
LEAST(SUBSTRING_INDEX(Pair, '-', 1), SUBSTRING_INDEX(Pair, '-', -1)),
'-',
GREATEST(SUBSTRING_INDEX(Pair, '-', 1), SUBSTRING_INDEX(Pair, '-', -1))) AS Pair,
COUNT(*) AS cnt
FROM yourTable
GROUP BY
LEAST(SUBSTRING_INDEX(Pair, '-', 1), SUBSTRING_INDEX(Pair, '-', -1)),
GREATEST(SUBSTRING_INDEX(Pair, '-', 1), SUBSTRING_INDEX(Pair, '-', -1))
ORDER BY
cnt DESC;
如果您的桌子是这样的:
Id | Name1 | Name2
1 | Anna | Bob
2 | Anna | Charlie
3 | Bob | Dan
4 | Bob | Anna
5 | Charlie | Anna
然后可以简化查询:
SELECT
CONCAT(LEAST(Name1, Name2), '-', GREATEST(Name1, Name2)) AS Pair,
COUNT(*) AS cnt
FROM yourTable
GROUP BY
LEAST(Name1, Name2),
GREATEST(Name1, Name2);