我有一个标记表,如下所示:
id | product_id | tag_id
---------------------------
1 | 1 | 10
2 | 1 | 12
3 | 2 | 10
4 | 3 | 11
我创建了一个搜索页面,用户将标签作为输入(1个或多个),并在数据库中搜索包含这些标签的记录。
例如:有2个用户输入
包含标记 - >使用这些标签搜索产品
排除标记 - >搜索没有这些标签的产品
因此,搜索查询必须先忽略排除标记,然后使用' include标记搜索产品。
用户可以输入1个或多个标签。
知道怎么做吗?
答案 0 :(得分:1)
运行此SQL查询:
$includedTags = join(',',$incTagsIdArr);
$excludedTags = join(',',$excTagsIdArr);
$sql = "SELECT product_id FROM $tagTable WHERE tag_id IN ($includedTags) AND tag_id NOT IN ($excludedTags)"
其中:
$incTagsIdArr
是用户$excTagsIdArr
是用户$tagTable
是您的标记"表名称答案 1 :(得分:0)
这是一种使用聚合和having
的简单方法:
select tt.product_id
from tagtable tt
group by tt.product_id
having sum(tt.tag_id in ($excludedtags)) = 0 and
sum(tt.tag_id in ($includedtags)) = #NumberIncludedtags;
您需要为第二个条件输入所包含标签的数量。此外,这假设标签表没有重复的行(如果是这样,可以使用count(distinct)
轻松修复,但会使查询混乱)。