簡體   English   中英

如何從多對多表中選擇一個ID,而另一個ID中不存在的記錄呢?

[英]How to select a record from a many to many table where one id exists in one but not another?

抱歉,該標題解釋得不好。

這是桌子...

產品ID到類別ID
(來源: alexanderdickson.com

我想選擇product_id56但如果在7 則不選擇

也許我丟失了劇情,但是我想到了這個查詢

SELECT `product_id` , `category_id`
FROM `wp_wpsc_item_category_assoc`
WHERE (
`category_id` =5
OR `category_id` =6
)
AND `category_id` !=7
LIMIT 0 , 30

除非顯然由於多對多關系,否則仍將返回category_id為7的記錄,在這種情況下, product_id為12的產品。

我如何更改此查詢以獲取category_id56所有產品,但如果它也是7的一部分則不能。

多謝你們。

更新

感謝您的所有答復。 已達到我的每日投票上限,因此明天我會回來投票支持有用的答案。

要切斷category_id = 7的記錄,您應該檢查每個product_id的所有記錄。 因此,您需要一個子查詢才能使用:

SELECT 
    product_id, 
    category_id
FROM wp_wpsc_item_category_assoc AS a
WHERE 
(  category_id = 5
OR category_id = 6)
AND
NOT EXISTS (
        SELECT * 
            FROM wp_wpsc_item_category_assoc AS b 
        WHERE a.product_id = b.product_id 
            AND b.category_id = 7
    )
SELECT product_id, category_id
FROM   wp_wpsc_item_category_assoc WINC
WHERE  WINC.category_id IN (5, 6)
AND    NOT EXISTS
    (SELECT 0 FROM wp_wpsc_item_category_assoc WEXC
     WHERE WEXC.product_id = WINC.product_id
     AND WEXC.category_id IN (7))

我們使用子查詢對每個特定的product_id進行排除。

我不確定我是否完全理解這個問題,但也許您需要使用並集或子查詢。

我建議的第一個想法是:

SELECT product_id , category_id
FROM
 (SELECT product_id , category_id
 FROM wp_wpsc_item_category_assoc
 WHERE product_id !=7)
WHERE (
product_id =5
OR product_id =6
)

我現在無法對此進行測試,因此括號可能會稍微漏出一點,但它可能會滿足您的需求。

您的問題表明您對產品ID感興趣,但是您提供的樣品檢查了類別,如有必要,請切換...

這適用於SQL Server,並且(應該)可移植到MySQL。

解決方案的要點是排除以任何方式鏈接到類別7的所有產品。

SELECT  Product_ID
        , Category_ID
FROM    wp_wpsc_item_category_assoc a
        LEFT OUTER JOIN (
          SELECT  Product_ID
          FROM    wp_wpsc_item_category_assoc
          WHERE   Category_ID = 7
        ) anot ON anot.Product_ID = a.ProductID
WHERE   anot.Product_ID IS NULL
        AND a.Category_ID IN (5, 6)        

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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