Home > Mobile >  Select Products NOT Bought by a Customer
Select Products NOT Bought by a Customer

Time:02-02

I have a test database with just three tables. How may I select which products have NOT been bought by CUSTOMER ID = 1? I'm unable to use the NOT IN keywords because in reality each table will be enormous and will exceed the 'IN' limits.

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);

I've attempted with something like this and many variations but cannot get 'Soup' and 'Paper' as the result...

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! :( */

CodePudding user response:

You can try to let condition C.ID = 1 to ON from where and using 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

  •  Tags:  
  • Related