我正在开发一个在线图书馆的搜索引擎,但我有点卡在这里。搜索标签时,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 行)时,它返回数据库中具有这些标签中的任何一个的两本书,但是当在数据库中搜索具有 BOTH 标签的一本书时,它什么也不返回。
查询有什么问题?这不是/一种方法吗?我在看什么?
谢谢!
编辑:根据要求,与应返回的书相关的每个表中的数据:
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
在 HAVING COUNT 行之前。就那么简单。taz 提供的答案也值得研究,特别是如果您的目标是优化搜索查询。