誰も私にこの種の検索をデータベースで行う方法を教えてもらえますか?JOINを使ってMySQLを検索するには?
私はこれらのテーブルを得た:
posts (id, tags_cache)
tags (id, name)
posts_tags (post_id, tag_id)
ユーザーが検索クエリを入力する(「水青」と言う)と私は両方のタグを持っている投稿を表示したいです。
SELECT p.*, GROUP_CONCAT(t.name) AS tags_search
FROM posts p
LEFT JOIN posts_tags pt ON p.id = pt.post_id
LEFT JOIN tags t ON pt.tag_id = t.id
GROUP BY p.id
HAVING FIND_IN_SET('water', tags_search) > 0
AND FIND_IN_SET('blue', tags_search) > 0
posts.tags_cache
テキスト列は、それが(:water:15 blue:20
この方法)に属している名前とタグのIDを格納します。私は検索すると考えることができます 唯一の方法は、FIND_IN_SET、この方法を使用しています。回避するために
は、検索のために、この列を使用してJOINを、私は LIKE とINSTRを試みたが、あなたは'LLは「タグ付けの記事を取得します「TER」、あなたのために検索することができますので、これらには、不正確な結果が得られます水 'と' termal 'などです。私はまた、正確な結果を与えるREGEXPを試みましたが、それは遅いプロセスです。
私は使用できませんMATCHはテーブルとしてInnoDBを使用しています。
だから、これを達成する他の方法はありますか?
[編集]
私は(だけでなく、2)ユーザーが多くのタグを検索できることを言及し、さらにタグを除外するのを忘れ:検索の投稿は「水」をタグ付けしましたが、「青」ではありません。 FIND_IN_SETでは、これは私の作品:
HAVING FIND_IN_SET('water', tags_search) > 0
AND NOT FIND_IN_SET('blue', tags_search) > 0
[EDIT2]
ypercubeが示唆したように、私は(つまり、唯一のクエリは、キャッシュされたのにかかった時間にチェック)いくつかの性能試験を行った、そしてこれらの結果、次のとおりです。
muists | Bill K | ypercu | includes:excludes
--------------------------
0.0137 | 0.0009 | 0.0029 | 2:0
0.0096 | 0.0081 | 0.0033 | 2:1
0.0111 | 0.0174 | 0.0033 | 2:2
0.0281 | 0.0081 | 0.0025 | 5:1
0.0014 | 0.0013 | 0.0015 | 0:2
この情報が有効なリソースであるかどうかはわからない...しかし、それはタグごとに登録しようとypercubeの方法が最速であることを示しています。
"なぜジョインを避けようとしていますか? –
さて、私はどこかで、多くのJOINを使うのはあまり良くないと読んでいます... – Parziphal
あなたはそれをどこで覚えていますか?将来そこで読むことを避けてください。 –