[英]How to exclude row in one-to-many relationship between tables (SQL query)
我有兩個表,Products 和 ProductTags(我也有表標簽,這不是問題的一部分)
我的查詢是
SELECT
product.id
FROM
Products JOIN ProductTags ON Products.id = ProductTags.product_id
WHERE ProductTags.tag_id = 10 and ProductTags.tag_id <> 20
表 ProductTags 是 product_id 和 tag_id 之間的一對多連接,如果這樣調用的話。 假設整個 ProductTags 表是:
product_id | tag_id |
---|---|
777 | 10 |
777 | 20 |
888 | 10 |
888 | 30 |
我從查詢中得到的 output 是 777 和 888。但我想排除標簽為 #20 的產品。 在實際查詢中,我還加入了其他表(我還需要訪問 Products 表的其他字段),所以我無法僅使用 ProductTags 表獲得正確的結果! 我知道我可以這樣做
SELECT product_id ProductTags WHERE tag_id = 10
但這不是正確的解決方案!
一種方法是使用聚合。
SELECT product_id id
FROM producttags
WHERE tag_id IN (10,
20)
GROUP BY product_id
HAVING max(tag_id) = 10;
另一個使用NOT EXISTS
和相關子查詢。
SELECT pt1.product_id
FROM producttag pt1
WHERE pt1.tag_id = 10
AND NOT EXISTS (SELECT *
FROM producttag pt2
WHERE pt2.product_id = pt1.product_id
AND pt2.tag_id = 20);
請注意, product
的連接不需要僅獲取產品 ID,除非producttags.product_id
沒有適當的外鍵約束。
SELECT product.id
FROM Products
JOIN ProductTags ON Products.id = ProductTags.product_id
GROUP BY product.id
HAVING SUM(ProductTags.tag_id = 10) > 0 -- at least one
AND SUM(ProductTags.tag_id = 20) = 0 -- none
這種形式允許任意數量的簡單或復雜條件。
例如:
-- strictly one row with tag_id = 30
AND SUM(ProductTags.tag_id = 30) = 1
-- at least one tag_id 40 or 50
AND SUM(ProductTags.tag_id IN (40, 50)) > 0
-- ... and so on
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.