2017-10-13 57 views
0

說我想選擇具有特定標籤或與關鍵字匹配的帖子。我可以排列從不同的WHERE子句得到的結果嗎?

select t1.* 
from (
select p.*, count(p.id) from plainto_tsquery('hElLo') AS q , post p 
left join post_tag pt on pt.post_id = p.id 
left join tag t on t.id = pt.tag_id 
WHERE (tsv @@ q) or t.id in (2,3) 
group by p.id 
) as t1 
order by count desc, ts_rank_cd(t1.tsv, plainto_tsquery('hElLo')) desc 
limit 5; 

上面沒有選擇我想要的。在tsv中,我給出了一個重量和description的重量。當按count排序時,現在變得毫無意義,因爲每個條目具有相同的權重。是否有可能做這樣的事情,如果這一行是從t.id in (2,3)中挑選出來的,他們會先排序,然後排序ts_rank_cd,或給每個匹配標記'A'權重,標題變成B權重,描述是D?

回答

1

嘗試CASE WHEN

select t1.* 
from (
select p.*, count(p.id), 
(CASE WHEN t.id in (2,3) THEN 1 ELSE 2 END) as ranking 
from plainto_tsquery('hElLo') AS q , post p 
left join post_tag pt on pt.post_id = p.id 
left join tag t on t.id = pt.tag_id 
WHERE (tsv @@ q) or t.id in (2,3) 
group by p.id 
) as t1 
order by count desc, ranking asc, ts_rank_cd(t1.tsv, plainto_tsquery('hElLo')) desc 
limit 5; 

編輯(正確答案):

select t1.* 
from (
select p.*, count(p.id), 
COUNT(1) filter(where t.id in (2,3)) ranking 
from plainto_tsquery('hElLo') AS q , post p 
left join post_tag pt on pt.post_id = p.id 
left join tag t on t.id = pt.tag_id 
WHERE (tsv @@ q) or t.id in (2,3) 
group by p.id 
) as t1 
order by count desc, ranking asc, ts_rank_cd(t1.tsv, plainto_tsquery('hElLo')) desc 
limit 5; 
+0

這似乎是接近我正在尋找,但Postgres的t時問我到組。也是。這將創建dup行 – user1865027

+0

實際上,我們要歸檔的目標存在嚴重錯誤。 Plz嘗試編輯答案。 – ninjarails

+0

你是我的救星!非常感謝。現在我需要努力如何實現這個休眠 – user1865027

0

我不知道爲什麼數是相同的,但你可以到order by增加更多的鍵:

order by count desc, 
     (t.id in (2, 3)) desc, 
     ts_rank_cd(t1.tsv, plainto_tsquery('hElLo')) desc ; 

desc是因爲真正的>假的,你想要的真正價值是第一。

相關問題