1
votes

requête mysql pour joindre deux tables afin de trouver des éléments qui n'apparaissent pas sur la bonne table

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.


1 commentaires

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.


3 Réponses :


1
votes

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


0 commentaires

3
votes

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


2 commentaires

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.



1
votes

"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

 Graphique laid créé par moi-même pour décrire ce JOIN a >


0 commentaires