簡體   English   中英

檢查多行並返回是否全部匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM