私はオンラインライブラリの検索エンジンに取り組んでいますが、ここで立ち往生しています。タグを検索する場合、OR検索(つまり、「tag1」または「tag2」の本)は正常に機能しますが、AND検索は問題を引き起こします。
これに使用するテーブル(およびその列)は次のとおりです。
books | book_id, other_info
tagmap | map_id, book_id, tag_id
tags | tag_id, tag_text
他の多くの検索オプションをユーザーが有効/無効にできるため、クエリはPHPによって生成されます。「tag1」と「tag2」のタグが付いた本を検索すると、次のクエリが生成されます。
SELECT DISTINCT b.book_id, b.other_info
FROM books b, tagmap tm, tags t
WHERE b.book_id = "NA"
OR ( (t.tag_text IN ("tag1", "tag2"))
AND tm.tag_id = t.tag_id
AND b.book_id = tm.book_id )
HAVING COUNT(tm.book_id)=2
WHERE行(結果は表示されません)があり、追加のパラメーターをクエリに簡単に追加できます。これはもっとうまく処理できることを私は知っていますが、今のところそれは問題ではありません。
OR検索(同じクエリですが、HAVING COUNT行がない)を実行すると、データベース内でこれらのタグのいずれかを持つ2冊の本が返されますが、データベース内で両方のタグを持つ1冊の本を検索すると、何も返されません。
クエリの何が問題になっていますか?これはそれを行う方法ではありませんか?私は何を見落としていますか?
ありがとう!
編集:リクエストに応じて、返却する必要のある本に関連する各テーブルのデータ:
books table:
book_id 110
tagmap table:
book_id 110 110
tag_id 15 16
tags table:
tag_id 15 16
tag_text tag1 tag2
解決策:私がしなければならなかったのは、含めることだけでした
GROUP BY b.book_id
HAVINGCOUNT行の前。そのような単純な。特に検索クエリの最適化を目的としている場合は、tazが提供する回答も検討する価値があります。