2017-08-17 8 views
0

最も一致するタグのある投稿に基づいて、ほとんど「推奨」されていない機能を作成しようとしています。最も一致するリレーションを持つエントリ

私はこのようなレイアウトを得た:私はidのポストのための推奨を取得しますので、もし

投稿

id 
--- 
1 
2 
3 
4 

post_tags

post_id | tag_id 
---------+--------- 
1  | 1 
1  | 2 
2  | 2 
2  | 3 
2  | 4 
3  | 1 
3  | 2 
3  | 4 
4  | 5 

タグ

id 
---- 
1 
2 
3 
4 
5 

SELECT DISTINCT 
    p.id, 
    p.title, 
    count(*) as cnt 
FROM 
    posts p 
INNER JOIN posts_tags pt ON pt.post_id= p.id 
INNER JOIN tags t ON pt.tag_id = t.id 
WHERE 
    t.id IN (
     SELECT 
      pt.tag_id 
     FROM 
      posts_tags pt 
     WHERE 
      pt.post_id = '30213' 
    ) 
GROUP BY 
    t. NAME 
order by count(*) desc 
LIMIT 0, 4 
:1のリストは、

私のクエリは、これまでのところ、このようになります

3(2/2試合を)行く 2(1/2マッチ) 4(0/2マッチ)すべきです

私がため、カウントDISTINCTが動作していない知っているが、私は彼がカウントだけか見てみたかったので、結果は次のようになります。

4 Foo 4881 
4 Foo 2560 
11 Bar 2094 
12 Baz 1998 

だから何happeネッド?それは一般にタグの出現を数えた。したがって、「Post 1」の最初に関連付けられたタグは、関連付けられた4881であり、一致する最初のエントリを引っ張ります。

問題が表示されますが、解決できません。

答えて

1

group byは意味がありません。

SELECT p.id, p.title, count(*) as cnt 
FROM posts p INNER JOIN 
    posts_tags pt 
    ON pt.post_id = p.id 
WHERE pt.tag_id IN (SELECT pt2.tag_id 
        FROM posts_tags pt2 
        WHERE pt2.post_id = 30213 
        ) 
GROUP BY p.id, p.title 
ORDER BY count(*) desc 
LIMIT 0, 4; 

これは0を返しません:あなたはポストないタグで集計します。それが重要な場合は、WHERE . . . IN . . .の代わりにLEFT JOINを使用する必要があります。また

は:

  • SELECT DISTINCTほとんどGROUP BYで使用されることはありません。そのためのユースケースを思いつくのは難しいことではありません。
  • tagsテーブルが不要なので、削除しました。
  • 数字の前後に一重引用符を使用しないでください。私はpost_idが本当に数字だと推測しています。
  • 修正はGROUP BYです。
+0

私はSQL関連の質問にいつもお手伝いしてくれることを覚えています。あなたはさらなる学習のための助言がありますか? – Soundz

関連する問題