[英]check multiple rows and return if all match
我有兩個這樣的表:
產品:
id name description
1 book book desc
2 tea tea desc
3 glasses glasses desc
產品屬性
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
所有值所在的行中$search_ids
在這種特定情況下,我希望它只返回tea
,因為只有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
首先,它返回這些值,因為只要$ 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;
我在您的數據集上對其進行了測試,並且可以運行,盡管可能有一個更簡單的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.