0

現在、ブログ用のタグ システムを使用しています。各ブログはブログ テーブルに挿入され、タグはタグ テーブルに挿入されます。タグ テーブルには、各タグをブログ アイテムにリンクする列 blog_id があります。

だから、私たちが持っているとしましょう:

Blog table:
id - name 
20 - a nice blog post about product x

Tag table:
id - blog_id - tag
12 - 20 - nice
13 - 20 - product x

検索文字列に基づいてタグを検索する検索機能があり、正常に機能します。

しかし、クエリを拡張して複数のタグを検索し、最も一致するもので並べ替えたいと思います。複数のタグを検索しても問題はありません。検索文字列を展開してループすることができるからです。

3 つのブログ投稿があり、それぞれに次のタグが付いているとします:
1. 晴れ、インイヤー、イヤホン、レビュー
2. 梨、アウトイヤー、イヤホン、レビュー
3. 梨、インイヤー、イヤホン、レビュー

そして、ユーザーが「ナシ インイヤー イヤホン」と検索した場合、結果の順序を
3. (3 つのタグが一致する
ため) 1. (2 つのタグが一致する
ため) 2. (1 つのタグが一致するため) のようにしたいと考えています。

クエリは次のようになります。

SELECT `b`.*
FROM (`ブログ` b)
どこ (
    b.name LIKE '%pear インイヤー イヤホン%'
    また
    b.id IN (
        bt.blog_id を選択
        FROM blog_tags bt
        WHERE bt.tag LIKE '%pear インイヤー イヤホン%'
        AND bt.blog_id = b.id
        )
    )
ORDER BY `b`.`date` desc


誰が私を助けてくれますか?
「全文検索」を見てきましたが、テーブルが InnoDB であるため、それはオプションではありません。

前もって感謝します!

4

2 に答える 2

2

次のクエリは、特定のリストに一致するタグの数をカウントし、一致した数で並べ替えます。

select b.*
from blog b join
     blog_tags bt
     on b.id = bt.blog_id
where bt.tag in ('pear', 'in-ear', 'earphones')
group by blog_id
order by COUNT(*) desc;

like元のクエリでの の使用は正しくないことに注意してください。どのタグにも string が含まれていません'pear in-ear earphones'

于 2013-06-20T20:43:21.237 に答える