匹配一个表中与第二个表的子集不匹配的项

时间:2013-10-03 09:03:09

标签: mysql sql

假设我有一个Product表和一个

id product
1  Apple
2  Bag
3  Cat
4  Ducati

和购物车表

 id  user_id   product_id
 1     1          2
 2     1          3
 3     2          1
 4     3          1

所以,我想看看一个特定的用户,看看他/她在购物车中没有的东西。

换句话说,在上面的例子中

SELECT ...... WHERE user_id=1 .....  

将返回Apple和Ducati,因为用户1已经拥有Bag和Cat。

(这可能与另一个问题重复,但有很多变化,我找不到完全匹配,并加入这些简单的术语可能有所帮助)

4 个答案:

答案 0 :(得分:2)

执行从产品到user1购买的所有产品的左连接,可以通过连接中的子选择来检索。这将导致所有不在user1关注的产品ID具有null产品ID。 where子句将选择所有null产品ID,这意味着它们不会出现在用户购物车中,主要是过滤购买的商品。

select p.name
from product p
left join (select product_id, user_id
           from cart where user_id = 1)
c
on p.id = c.product_id
where c.product_id is null;

SQL小提琴: http://sqlfiddle.com/#!2/5318eb/17

答案 1 :(得分:0)

Select
  * 
From Product p
Where p.id Not In
    (
        Select c.product_id
        From Cart c
        Where User ID = ____
    )

答案 2 :(得分:0)

SELECT product FROM product_table 
WHERE product NOT IN
(SELECT product_id FROM cart_table WHERE user_id = 1);  

答案 3 :(得分:0)

这将为所有不在购物车中的用户提供所有产品。

select  c.user_id,a.Product
from cart c Cross Join product a 
left Join 
cart b on b.product_id=a.id and c.user_id=b.user_Id
where b.product_id is null
group by  c.user_id,a.Product

Sql Fiddle Demo