mysql - 选择一列上的值在另一列上具有相同的一组值
问题描述
我有一个“关系表”,它存储了哪些帖子有哪些标签。就像 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
从 column返回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): 组函数使用无效
解决方案
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中工作
推荐阅读
- java - JavaFX Maven jfx:jar 错误:找不到工件 javafx-packager
- javascript - 生成 PDF 并返回响应
- filter - 在卷积过程中翻转过滤器背后的直觉是什么?
- python - 更改通过 pybind11_add_module 创建的库的输出目录
- tsql - PLSQL 到 TSQL - REGEXP
- arduino - 将.bin文件上传到esp8266的问题
- arrays - 如何在 Spark 中将文件名作为列传递
- java - 为什么指数函数在java和python中给出不同的结果?
- java - 如何将所有行输出到给定的编写器并返回字节数
- http - SIM800l 延迟回复。Http 获取