所以我的数据库包含一个项目列表:
items: item.id | item.title
Run Code Online (Sandbox Code Playgroud)
我有一个第二个表,它将许多标签与项目相关联:
tags: tag.id | item.id
Run Code Online (Sandbox Code Playgroud)
项可以具有与其相关联的若干标签(例如,5,20和25),因此对于标签表中的每个标签值将具有行.
我希望能够确定特定标记是否与项目相关联,而不会丢失所有其他标记数据.例如,
SELECT items.id, items.title
FROM items
INNER JOIN tags ON (tag.tag_id=items.id)
WHERE tag.id =27
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它消除了包含其他标记值的行(如果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)
Run Code Online (Sandbox Code Playgroud)
(我看到这篇文章关于你如何不能用ARRAY_AGG选择一个AS命名列)
但是上面的代码在HAVING子句的ANY部分产生语法错误.
思考?
bho*_*ard 16
事实证明,Postgres的ANY关键字是双向的,不能对称使用.
因此工作代码是:
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))
Run Code Online (Sandbox Code Playgroud)