如何从多个表中选择一个记录,其中一个ID存在于一个而不是另一个中?

时间:2010-08-10 09:06:21

标签: sql mysql

很抱歉,如果该标题没有解释清楚。

这是表......

product id to category id http://alexanderdickson.com/hosted/stackoverflow.com/product-id-to-category-id.png

我想选择product_id5中的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 56的所有产品,但如果它也是7的一部分则不会。< / p>

谢谢你们。

更新

感谢您的所有答案。我的每日投票限额已达到,所以我明天会回来并投票给有用的答案。

4 个答案:

答案 0 :(得分:1)

要使用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
    )

答案 1 :(得分:1)

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进行排除。

答案 2 :(得分:1)

我不确定我是否完全理解这个问题,但您可能需要使用联合或子查询。

我建议的第一个想法是:

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感兴趣,但您提供的样本会检查该类别,必要时进行切换......

答案 3 :(得分:0)

这适用于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)