2017-10-13 3 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には、私はtitle重量とdescription重量を与えました。 countでソートすると、それぞれのエントリの重みが同じであるため、現在は無意味になります。この行がt.id in (2,3)から選択された場合、最初にソートされ、次にts_rank_cdでソートされたり、各一致タグに「A」加重、タイトルがB加重となり、説明がDですか?

答えて

1

するTry 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でグループに私を求めているものに近いように思われます。 idも。これは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があります最初。

関連する問題