mysql - 选择一列上的值在另一列上具有一组相同的值

标签 mysql select group-by mariadb

我有一个“关系表”,用于存储哪个帖子有哪些标签。就像 Stack Overflow 一样,一个帖子可以有多个标签,一个标签可以有多个帖子。

该表只有两列,如下所示:

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 也是如此。

我想选择所有帖子(帖子 ID),其中存在具有相同 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 告诉我:

ERROR 1111 (HY000): Invalid use of group function

最佳答案

GROUP_CONCAT() 是一个聚合函数,因此您不能在 WHERE 子句中应用它,因为它是在 SELECT 中计算的子句(这发生在 WHERE 之后)。

另请注意,您应该在 GROUP_CONCAT() 函数中添加 ORDER BY。关系数据库中不保证顺序,除非您特别指定。

你可以这样做:

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

关于mysql - 选择一列上的值在另一列上具有一组相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55122929/

相关文章:

sql - Postgres 中同月的总和值

mysql - 在 Docker 中引导 Percona Xtradb 集群出现错误 : Can't open and lock privilege tables: Table 'mysql.user' doesn't exist

java - 查询两个以上的实体

javascript - 如何获取带有选定文本的div?

postgresql - 我的 PostgreSQL 语句有什么问题?这在 MySql 上运行

sql - hive sql 聚合

php - 在 PHP 中解析和回显 SQL 结果

mysql - 条件 SQL SELECT - 当返回集为空时,执行另一个 SELECT?

MySQL错误: unknown table `airports`

jquery - 根据下拉菜单显示/隐藏表单