【问题标题】:How to count how many times a group of words appear in a column, in any orders?如何计算一组单词以任意顺序出现在一列中的次数?
【发布时间】:2019-04-20 09:41:29
【问题描述】:

我有一个表格,其中有一列显示成对的学生,例如“Anna-Bob”、“Anna-Charlie”、“Bob-Dan”、“Bob-Anna”、“Charlie-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 

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您应该认真考虑规范化您的数据模型并将两个名称分别存储在不同的列中。话虽如此,您可以使用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);
    

    【讨论】:

    • 嗨蒂姆。非常感谢您的回答。我真的很感谢你的帮助。如果两个名称中的每一个都存储在不同的列中,您能否告诉我您的回答?我试图弄清楚如何但仍然无法。谢谢!
    猜你喜欢
    • 2015-09-18
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多