我有一個哈希表(用于標記專案),其中有一個額外的列來表示專案與其標簽之間的關系強度:
item_id | tag_name | relationship
1 | linux | 0.7
1 | computer | 0.9
2 | garden | 0.5
2 | shovel | 0.65
...
我想選擇所有同時標記'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'and標記的專案'computer',這非常有效。但問題是,對于具有附加標簽的專案,ORDER BY SUM(tags.relationship)將與專案所具有的其他標簽相加......換句話說,具有最多標簽的專案將首先回傳(這不是我想要的)。
我怎樣才能SUM()只對我選擇的標簽的關系求和?
uj5u.com熱心網友回復:
您可以簡單地使用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;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/439638.html
標籤:sql PostgreSQL 通过...分组 哈希表 聚合函数
