如何计算一组单词以任何顺序出现在列中的次数?

时间:2019-04-20 01:13:16

标签: mysql sql

我有一个表格,其中有一列显示成对的学生,例如'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 

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);