Select 客户未购买的产品

Select Products NOT Bought by a Customer

我有一个只有三个 table 的测试数据库。我如何才能 select 哪些产品没有被 CUSTOMER ID = 1 购买过? 我无法使用 NOT IN 关键字,因为实际上每个 table 都将是巨大的并且会超过 'IN' 限制。

DROP DATABASE IF EXISTS testdata;
CREATE DATABASE IF NOT EXISTS testdata DEFAULT CHARACTER SET = utf8;
USE testdata;
SET character_set_client = utf8;


CREATE TABLE CUSTOMER (
  ID INTEGER NOT NULL AUTO_INCREMENT,     /* Unique Identifier */

  FIRSTNAME VARCHAR(200) DEFAULT '' NOT NULL,   /* Customer Firstname */
  BALANCE INTEGER DEFAULT '0' NOT NULL,       /* Credit balance of customer */

  PRIMARY KEY(ID)
);

insert into CUSTOMER (FIRSTNAME, BALANCE)
  VALUES ('Steve', 100),
  ('Dwayne', 100),
  ('John', 200),
  ('George', 50),
  ('Alice', 100);

CREATE TABLE PRODUCT (
  ID INTEGER NOT NULL AUTO_INCREMENT,     /* Unique Identifier */

  ITEMNAME VARCHAR(200) DEFAULT '' NOT NULL,   /* Product name */
  PRICE INTEGER DEFAULT '0' NOT NULL,       /* Price of product */

  PRIMARY KEY(ID)
) ;

insert into PRODUCT (ITEMNAME, PRICE)
  VALUES
  ('Car', 50),
  ('Lego', 12),
  ('Soup', 3),
  ('Paper', 1),
  ('PC', 60);

CREATE TABLE CUSTOMER_PRODUCT (
  ID INTEGER NOT NULL AUTO_INCREMENT,
  CUSTOMERID INTEGER NOT NULL,              /* Person ID */
  PRODUCTID INTEGER NOT NULL,               /* Product ID */
  PRIMARY KEY(id)
  ) ;

ALTER TABLE CUSTOMER_PRODUCT ADD CONSTRAINT FK_PERS_PROD_PERS FOREIGN KEY (CUSTOMERID) REFERENCES CUSTOMER(ID) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE CUSTOMER_PRODUCT ADD CONSTRAINT FK_PERS_PROD_PROD FOREIGN KEY (PRODUCTID) REFERENCES PRODUCT(ID) ON DELETE CASCADE ON UPDATE CASCADE;

insert into CUSTOMER_PRODUCT (CUSTOMERID, PRODUCTID)
  VALUES (1, 1),
  (1, 2),
  (2, 4),
  (1, 5);

我已经尝试过类似的方法和许多变体,但结果无法得到 'Soup' 和 'Paper'...

select * from PRODUCT P
right join CUSTOMER_PRODUCT CP on P.ID = CP.PRODUCTID
left join CUSTOMER C on C.ID = CP.CUSTOMERID
where C.ID = 1 
/* and this is where I get stuck! :( */

您可以尝试让条件 C.ID = 1where 变为 ON 并使用 LEFT JOIN

select * from PRODUCT P
left join CUSTOMER_PRODUCT CP on P.ID = CP.PRODUCTID
left join CUSTOMER C on C.ID = CP.CUSTOMERID
AND CP.CUSTOMERID = 1 
WHERE C.ID IS NULL

sqlfiddle