Besoin d'aide pour joindre correctement deux tables dans MySQL 8+.
La table de gauche a des clients, la table de produits de gauche. Je veux trouver les clients qui n'ont encore rien acheté.
select distinct(customers.customerID) from customers LEFT JOIN products ON customers.customerID = products.customerID WHERE products.customerID IS NULL
Donc, en utilisant ce schéma ci-dessus, la réponse doit être le client 2 et le client 3. Pour trouver la réponse, je a utilisé la déclaration suivante:
create table customers (
customerID int,
customerDetails varchar(200),
PRIMARY KEY (customerID)
);
create table products (
productID int,
productDetails varchar(200),
customerID int,
PRIMARY KEY (productID),
FOREIGN KEY (customerID) REFERENCES customers(customerID)
);
insert into customers (customerID, customerDetails) VALUES (1,"customer 1");
insert into customers (customerID, customerDetails) VALUES (2,"customer 2");
insert into customers (customerID, customerDetails) VALUES (3,"customer 3");
insert into products (productID, productDetails, customerID) VALUES (1,"product 1", 1);
insert into products (productID, productDetails, customerID) VALUES (2,"product 2", 1);
La déclaration semble fonctionner mais je voudrais demander si ma requête est dans la bonne direction et s'il existe un meilleur moyen (plus rapide / plus sûr ) pour le faire.
3 Réponses :
La clause distincte n'est pas une fonction
select distinct customers.customerID from customers LEFT JOIN products ON customers.customerID = products.customerID WHERE products.customerID IS NULL
Je pourrais utiliser une requête EXIST ici:
SELECT
c.customerID
FROM customers c
WHERE NOT EXISTS (
SELECT 1 FROM products p
WHERE
p.customerID = c.customerID
);
plus rapide? ou pour toute autre raison particulière?
En termes de performances, ma réponse devrait être à peu près la même que celle donnée par @scaisEdge; Je propose uniquement EXISTS comme une autre façon d'écrire votre logique.
"La déclaration semble fonctionner mais je voudrais demander si ma requête est dans la bonne direction" : C'est en effet une manière courante d'écrire une telle requête. Cependant, vous pouvez supprimer la clause DISTINCT , il n'y aura pas de doublons.
select customers.customerID from customers LEFT JOIN products ON customers.customerID = products.customerID WHERE products.customerID IS NULL
Vous n'avez pas besoin de distinct dans ce cas. Chaque client n'ayant rien acheté n'aura qu'une seule ligne dans les résultats.