所以我的数据库包含一个项目列表:
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)
(我看到这篇文章是关于你如何不能用 ARRAY_AGG 选择一个以 AS 命名的列)
但是上面的代码在 HAVING 子句的 ANY 部分产生了一个语法错误。
想法?