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 = 1
从 where
变为 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
我有一个只有三个 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 = 1
从 where
变为 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