【问题标题】:Postgres: filtering results using ARRAY_AGG and HAVING (instead of WHERE)Postgres:使用 ARRAY_AGG 和 HAVING(而不是 WHERE)过滤结果
【发布时间】:2013-11-13 09:25:03
【问题描述】:

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

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 部分产生了一个语法错误。

想法?

【问题讨论】:

  • 我使用 tags 表来过滤 items 表中的结果。例如,商品可能有 5 个标签中的一个或多个(1=好、2=坏、3=红色、4=绿色、5=黄色),我想选择好和黄色的商品。

标签: sql postgresql


【解决方案1】:

原来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))

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    相关资源
    最近更新 更多