sql - 基于多对多关系选择排序数据并选择所有相关数据的最有效方法是什么

标签 sql postgresql

所以,我有这个 postgreSQL 数据库结构

帖子

编号 标题 文字

标签

编号 姓名

posts_tags

post_id tag_id

因此,一个帖子可以有多个标签,一个标签可以有多个故事。 我想做的是查询数据库并获取所有具有特定标签的帖子。 我可以用这样的方法来做到这一点:

SELECT p.* FROM posts p
INNER JOIN posts_tags pt ON pt.post_id = p.id
INNER JOIN tags t ON pt.tag_id = t.id
WHERE t.name = 'my_tag'

但我还想选择附加到每个帖子的所有标签,现在我可以做类似的事情

SELECT p.*, t.name` FROM posts p ...

而不是我上面所做的,但它只会给我一个标签的名称,而我需要得到所有标签。 最有效的性能方式是什么? 以及如何做同样的事情,但只选择包含多个指定标签的帖子?

最佳答案

最简单的方法可能是聚合:

SELECT p.*, ARRAY_AGG(t.name) as tags
FROM posts p INNER JOIN
     posts_tags pt
     ON pt.post_id = p.id INNER JOIN
     tags t
     ON pt.tag_id = t.id
GROUP BY p.id
HAVING bool_or(t.name = 'my_tag');

bool_or() 表示其中一个标签就是您要查找的标签。

关于sql - 基于多对多关系选择排序数据并选择所有相关数据的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54968257/

相关文章:

sql - 如何在 T-SQL 中拆分以逗号分隔的重复字符串

sql - 如何使用SQL对流量日志中访问源的事件进行归因?

java - 使用免费数据库和带有 Spring & Hibernate Web 应用程序的 Java 进行冗余数据库复制

sql - DISTINCT 有两个 array_agg(或一个 array_agg 里面有元组)?

sql - 使用sql批量插入特定值

sql - 如何通过 Spring Boot JPA 执行具有 INTERVAL 子句的 native SQL 查询?

sql - sql 文件中的 Resharper 实时模板

sql - SQL Server 中的完全递归员工-老板关系

Postgresql 9.3 只记录插入、删除和更新

php - Laravel 在查询 JSONB 列(转换为数组)时是否调用 json_decode 一次或多次?