我有两张桌子:
产品:
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
答案 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;
我在您的数据集上测试了它并且它可以工作,尽管可能有一个更简单的解决方案。