如何查询有序哈希 Table (PostgreSQL)

How to Query a Ordered Hash Table (PostgreSQL)

我有一个散列 table(用于标记项目),其中有一个额外的列用于确定项目及其标签之间的关系强度:

item_id | tag_name | relationship
1       | linux    | 0.7
1       | computer | 0.9
2       | garden   | 0.5
2       | shovel   | 0.65
...

我想 select 所有标有 'linux''computer' 的项目(允许更多标签),按项目与这两个标签之间的关系之和排序。

这是我查询数据库的尝试:

SELECT * FROM items
INNER JOIN (
SELECT items.id FROM items
    INNER JOIN tags ON items.id = tags.item_id
    GROUP BY tags.item_id
    HAVING ARRAY_AGG(tags.tag_id) @> ARRAY['linux','computer']
    ORDER BY SUM(tags.relationship) DESC
) tagged_items ON items.id = tagged_items.id

对于 标记为 'linux''computer' 的项目,这非常有效。但问题在于,对于具有附加标签的项目,ORDER BY SUM(tags.relationship) 将对项目所具有的其他标签求和...换句话说,具有最多标签的项目将首先 return(这不是我想要的)。

如何让 SUM() 只对我正在 select 使用的标签的关系求和?

您可以简单地使用 in:

select id
from items i
where tags_id in ('linux', 'computer')
group by id
order by sum(relationship) desc;

除非你想要所有列,否则你可以在cte中使用上面的查询并加入:

with tmp as (
    select id
    from items
    where tags_id in ('linux', 'computer')
    group by id
    order by sum(relationship) desc
)
select i.*
from tmp t
inner join items i on t.id = i.id;