Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在列表中查找列表_Php_Mysql - Fatal编程技术网

Php 在列表中查找列表

Php 在列表中查找列表,php,mysql,Php,Mysql,我在查找未专门链接的相关数据库行时遇到问题。假设我们有5张桌子 Products Id | name Product_tags Id | product_id | tag_id Tags Id | name Blog Id | name Blog_tags Id | blog_id | tag_ids 所以我要做的就是抓取一个产品,通过product_tags表抓取这个产品的标签。比如说我得到了这样的东西 Product 101 Tags 123,124,125,126 selec

我在查找未专门链接的相关数据库行时遇到问题。假设我们有5张桌子

Products
Id | name

Product_tags
Id | product_id | tag_id

Tags
Id | name

Blog 
Id | name

Blog_tags
Id | blog_id | tag_ids
所以我要做的就是抓取一个产品,通过product_tags表抓取这个产品的标签。比如说我得到了这样的东西

Product 101
Tags 123,124,125,126
select * from Blog_tags where "'".implode(",",$tagIds)."'" LIKE concat("%", tag_ids, "%")
现在我有了这个产品页面。问题是,现在我想找到一个博客,如果它适合这个产品,但它不需要有所有的标签,该产品只需要有所有的博客拥有。所以,如果博客有124和126标签,它需要匹配。目前,我将博客的所有标签保存在一行(逗号分隔),但如果需要,可以更改为每行保存一个标签。如果它是反向的,我可以这样做,但我需要在另一个表中检查部分列表

Product 101
Tags 123,124,125,126

Should find
Blog 201
Tags 124,126

But not 
Blog 202
Tags 120,124
我尝试了一些方法,但我找不到一种方法来实现这一点,我最接近的尝试是像这样的反转

Product 101
Tags 123,124,125,126
select * from Blog_tags where "'".implode(",",$tagIds)."'" LIKE concat("%", tag_ids, "%")
当产品只有1,2,3,而博客只有1,3时,这种方法是有效的。

这是未经测试的,并且只能从记忆中获得,所以请随意评论并告诉我它是否有效

首先,规范化标记列表,不要使用逗号分隔的字符串。您说过这可以更改,所以我将假定每个标记一行,列名为
tag\u id

让我们首先查找包含您产品101的一些标签的博客

SELECT *
FROM Blog
JOIN Blog_tags ON Blog.Id = Blog_tags.blog_id
WHERE tag_id IN (123,124,125,126)
GROUP BY Blog.Id
现在,此查询还将包括不在此列表中的标记的博客。所以我们需要移除它们。我认为类似的方法可以奏效:

SELECT *
FROM (
  SELECT Blog.id as blogId
  FROM Blog
  JOIN Blog_tags ON Blog.Id = Blog_tags.blog_id
  WHERE tag_id IN (123,124,125,126)
  GROUP BY Blog.Id
) as Blog_filtered
LEFT JOIN Blog_tags ON Blog_filtered.blogId = Blog_tags.blog_id AND Blog_tags.tag_id NOT IN (123,124,125,126)
WHERE Blog_tags.id IS NULL
GROUP BY Blog_filtered.blogId

如果我正确理解了你的问题:你有一个标签列表(来自产品),你想找到标签都包含在这个列表中,并且至少有一个标签的博客?是这样吗?是的。所有的博客标签都应该出现在产品标签列表中,但是产品标签列表可以有额外的标签,而这些标签在博客列表中是不存在的。我已将它们包含在您的答案中。@xStoryTeller在您的编辑中,您只选择了博客ID。您确定不需要更多(如名称)吗?