sql - Postgres : filtering results using ARRAY_AGG and HAVING (instead of WHERE)

标签 sql postgresql

所以我的数据库包含一个项目列表:

items:  item.id | item.title

我还有第二个表,其中将许多标签与项目相关联:

tags:  tag.id | item.id

一个项目可能有多个与之关联的标签(例如 5、20 和 25),因此标签表中的每个标签值都有一行。

我希望能够在不丢失所有其他标签数据的情况下确定特定标签是否与某项相关联。例如,

SELECT items.id, items.title
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
WHERE tag.id =27

不起作用,因为它消除了包含其他标记值的行(如果 tag.id 为 27,则它不能是特定行上的任何其他值)。

为了解决这个问题,我想使用 ARRAY_AGG 将各个标签编号汇总到一个数组中,我可以(应该)根据它轻松测试成员值。

SELECT items.id, items.title
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
GROUP BY items.id
HAVING ANY(ARRAY_AGG(tags.tag_id)=27)

(我看到了 this post about how you can't SELECT an AS-named column with ARRAY_AGG )

但上面的代码在 HAVING 子句的 ANY 部分产生语法错误。

想法?

最佳答案

结果是 Postgres 的 ANY keyword是双面的,不能对称使用。

因此工作代码是:

SELECT items.id, items.title, ARRAY_AGG(tags.tag_id)
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
GROUP BY items.id
HAVING 27 = ANY(ARRAY_AGG(tags.tag_id))

关于sql - Postgres : filtering results using ARRAY_AGG and HAVING (instead of WHERE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19943327/

相关文章:

hibernate - Persistence.createEntityManagerFactory() 需要很长时间才能返回

java - 重用结果集

java - 表达式不在聚合或 GROUP BY 列中异常

mysql - 列的累积和不起作用

mysql - 具有多个最终用户的 SQL 数据库体系结构

ruby-on-rails - 如何在 rspec 中模拟数据库查询响应以根据响应测试其他方法

mysql - 合并两个查询的结果

python - 在 Flask-sqlalchemy 和 Postgresql 中使用 JSON 类型

java - 在子类的 Hibernate 中为每个表指定不同的序列

php - Doctrine - PostgreSQL - 表/字段名称中的大写和空格