检查多行,如果全部匹配则返回

时间:2014-03-14 15:38:54

标签: php mysql

我有两张桌子:

产品:

id  name       description
1   book book  desc
2   tea tea    desc
3   glasses    glasses desc

product_attributes

product_id    attribute_id
1             2
2             7
2             8
3             2
3             7
3             9
3             10
1             2
1             5
1             7

我还有两个名为$pid的变量,它们包含产品ID,其值为2,3,1$search_ids,其中包含属性ID且值为7,8

我希望仅在product_id中的一个ID包含$search_ids

的所有值的行中时返回结果

在这种特定情况下,我希望它只返回tea,因为只有茶的id在行中,所有值都来自$search_ids(7和8)。

我尝试了以下但是它返回了所有3个产品,然后再次喝茶两次,所以我得到了5个结果。我理解它的逻辑,但不知道如何改变它做我想做的事。

$q = "SELECT p.name FROM products AS p, product_attributes AS pa WHERE p.id = pa.product_id AND pa.product_id IN ($pid) AND pa.attribute_id IN ($search_ids)";

通过上面的查询,我得到以下内容:

Tea
glasses
Book
Tea
Tea

1 个答案:

答案 0 :(得分:0)

首先,它返回这样的值,因为只要$ search_ids包含任何搜索的id,它就会给你一个名字。这就是SQL“IN”的工作原理。

尝试以下(愚蠢而且可能不是太优)解决方案:

助手变量:

$search_ids_size = count($search_ids);

查询:

SELECT DISTINCT(p.name) FROM products AS p, product_attributes AS pa 
  WHERE p.id = pa.product_id 
     AND p.id IN ($pid)
     AND (SELECT count(*) FROM product_attributes WHERE product_id = p.id 
          AND attribute_id IN ($search_ids)) = $search_ids_size;

我在您的数据集上测试了它并且它可以工作,尽管可能有一个更简单的解决方案。