如何查询有序哈希 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;
我有一个散列 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;