[英]How to select a record from a many to many table where one id exists in one but not another?
抱歉,該標題解釋得不好。
這是桌子...
(來源: alexanderdickson.com )
我想選擇product_id
在5
或6
但如果在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_id
為5
或6
所有產品,但如果它也是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.