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个用户输入

  • 包含标签->搜索带有这些标签的产品

  • 排除标签->搜索没有这些标签的产品

因此,搜索查询必须首先忽略排除标记,然后搜索带有“include tag”的产品

编辑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)"
其中:

  • $incTagsIdArr
    是用户请求标记ID的数组
  • $excTagsIdArr
    是用户排除的标记ID数组
  • $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不在)组中?