Выберите значения в одном столбце с одинаковым набором значений в другом столбце - PullRequest
0 голосов
/ 12 марта 2019

У меня есть «реляционная таблица», в которой хранятся записи и теги. Как и в случае переполнения стека, в сообщении может быть много тегов, а в теге может быть много сообщений.

Таблица содержит только два столбца и выглядит следующим образом:

pid tid

1   3
1   4

2   1
2   3
2   4

3   1
3   3
3   4

4   1
4   3

5   1
5   3

6   2
6   4

В приведенной выше таблице сообщения 2 и 3 имеют идентичный набор тегов (значения в другом столбце tid), как и сообщения 4 и 5.

Я хочу выбрать все посты (идентификаторы постов), где существует еще один пост с таким же набором tid, поэтому запрос должен вернуть 2 3 4 5 из столбца pid.

Я работаю на MariaDB 10.1.38.

Вот моя собственная попытка, но, очевидно, она провалилась:

SELECT p.pid
FROM post_tags AS p
WHERE EXISTS (
    SELECT *
    FROM post_tags AS p2
    WHERE
      GROUP_CONCAT(p.tid SEPARATOR ',') = GROUP_CONCAT(p2.tid SEPARATOR ',')
    GROUP BY p2.pid
  )
GROUP BY p.pid;

MariaDB сказала мне:

ОШИБКА 1111 (HY000): недопустимое использование групповой функции

1 Ответ

1 голос
/ 12 марта 2019

GROUP_CONCAT() является агрегатной функцией, поэтому вы не можете применить ее в предложении WHERE, так как она оценивается в предложении SELECT (это происходит после WHERE).

Такжеобратите внимание, что вы должны добавить ORDER BY в функцию GROUP_CONCAT().В реляционной базе данных нет гарантированного порядка, если вы не укажете его.

Вы можете сделать это следующим образом:

SELECT t1.pid FROM 
(
    SELECT
    pid, GROUP_CONCAT(tid ORDER BY tid) AS gctid
    FROM t t1
    GROUP BY pid
) t1
JOIN (
    SELECT
    pid, GROUP_CONCAT(tid ORDER BY tid) AS gctid
    FROM t t1
    GROUP BY pid
) t2 ON t1.pid != t2.pid AND t1.gctid = t2.gctid
  • увидеть, как он работает в реальном времени в sqlfiddle
...