【问题标题】:Select values on one column having an identical set of values on another column选择一列上的值在另一列上具有相同的一组值
【发布时间】:2019-08-03 00:15:46
【问题描述】:

我有一个“关系表”来存储哪些帖子有哪些标签。就像 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 集的另一个帖子,因此查询应从列 pid 返回 2 3 4 5。

我在 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):组函数使用无效

【问题讨论】:

    标签: mysql select group-by mariadb


    【解决方案1】:

    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
    
    • 在sqlfiddle 中实时查看它的工作情况

    【讨论】:

      猜你喜欢
      • 2017-02-14
      • 2012-05-25
      • 2022-01-01
      • 2019-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多