Php 搜索具有相似标记id的记录
我有一个如下所示的标记表:Php 搜索具有相似标记id的记录,php,mysql,sql,database,Php,Mysql,Sql,Database,我有一个如下所示的标记表: id | product_id | tag_id --------------------------- 1 | 1 | 10 2 | 1 | 12 3 | 2 | 10 4 | 3 | 11 我正在创建一个搜索页面,该页面将标签作为用户(1个或更多)的输入,并在数据库中搜索存在这些标签的记录 例如: 如果用户输入“10”,则使用上面
id | product_id | tag_id
---------------------------
1 | 1 | 10
2 | 1 | 12
3 | 2 | 10
4 | 3 | 11
我正在创建一个搜索页面,该页面将标签作为用户(1个或更多)的输入,并在数据库中搜索存在这些标签的记录
例如:
- 如果用户输入“10”,则使用上面的表格,结果将是产品id 1和2
- 有2个用户输入
- 包含标签->搜索带有这些标签的产品
- 排除标签->搜索没有这些标签的产品
知道如何执行此操作吗?运行此SQL查询:
$includedTags = join(',',$incTagsIdArr);
$excludedTags = join(',',$excTagsIdArr);
$sql = "SELECT product_id FROM $tagTable WHERE tag_id IN ($includedTags) AND tag_id NOT IN ($excludedTags)"
其中:
是用户请求标记ID的数组$incTagsIdArr
是用户排除的标记ID数组$excTagsIdArr
是您的“标记”表名$tagTable
拥有
:
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)
轻松解决,但这会使查询变得混乱)。问题是输入可以是一个或多个标记,有两个输入,一个要排除,一个要包含。我已经更新了我的问题,当用户在每个列表中输入10+个标签时,这个查询的效率如何?像要排除的10个标记和要包含的10个标记一样?显示的查询很像ls*.jpg | egrep-v'aa | bb | cc'@RémiBecheras:由于某些原因,您的解决方案不会删除带有$excTagsIdArr标记的产品id。我使用的查询:通过m.id从产品m内部连接标签tg ON(m.id=tg.pdt_id)中选择m.id,其中1和(像'tomo%'或像'tomo%'这样的nme)和(像(34,20)中的tg.tag_id和(42)中的tg.tag_id不在)组中?