Как посчитать, сколько раз группа слов появляется в столбце в любых порядках? - PullRequest
2 голосов
/ 20 апреля 2019

У меня есть таблица, в которой есть столбец, показывающий пары учеников, такие как «Анна-Боб», «Анна-Чарли», «Боб-Дан», «Боб-Анна», «Чарли-Анна» ...

Я хочу посчитать, сколько раз каждая пара учеников появляется в этом столбце в любом порядке. Например, для пары «Анна-Боб» я буду считать тех, у которых есть «Анна-Боб» или «Боб-Анна».

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 Ответ

5 голосов
/ 20 апреля 2019

Вам следует серьезно подумать о нормализации вашей модели данных и хранении каждого из двух имен в отдельных столбцах.При этом вы можете обойти эту проблему, используя 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...