2017-06-02 1 views
0

J'ai des tables [vendeur], [annonce] et [vente]. En raison d'une bizarrerie dans le fonctionnement de mon entreprise, le vendeur d'une vente peut être changé pour un autre vendeur (appelons-les ventes orphelines), mais la table [vente] est mise à jour pour refléter la nouvelle publicité. le nouveau vendeur.left join où est nul et peut-être count() = 0?

Je veux compter le prix pour les ventes d'orphelins des utilisateurs qui ont seulement des ventes ORPHELINS. Avant d'avoir le prix, je n'arrive même pas à créer une liste d'utilisateurs qui n'ont eu que des ventes orphelines. J'essaie de faire une jointure gauche avec où est nulle afin que je puisse obtenir ces publicités qui n'ont pas de ventes, et puis avoir count() = 0 afin que je puisse obtenir ces utilisateurs qui n'ont pas de ventes.

SELECT seller.id 
FROM seller 
JOIN advert ON advert.seller_id = seller.id 
JOIN sale orphan ON advert.id = orphan.advert_id 
JOIN sale accomplished_sale ON advert.id = accomplished_sale.advert_id 
WHERE orphan.id IS NULL 
GROUP BY seller.id 
HAVING count(accomplished_sale.id) = 0 

Cependant, ce que je reçois est chaque vendeur qui a au moins 1 vente sans vente, mais qui ont d'autres annonces avec des ventes. Étant donné que la relation publicité-vente est n-> 1, j'imagine qu'une jointure normale n'est qu'une jointure à gauche, n'est-ce pas? la même chose arrive avec vendeur-annonce.

Qu'est-ce que je fais mal? Des idées?

Répondre

0

Effectuez les opérations suivantes sans se joindre à la syntaxe:

SELECT seller.id 
FROM seller, sale, advert 
WHERE advert.seller_id = seller.id 
AND advert.id = sale.advert_id 
AND sale.id IS NULL 
GROUP BY seller.id 
HAVING count(accomplished_sale.id) = 0 
+0

@MichaelMcGriff Oui, c'est cartésien rejoindre. Changé. –

0

Si vous avez besoin d'une jointure gauche sur un (ou plusieurs) tables vous devez l'appeler par exemple: pour se joindre à gauche en vente comme orphelin

SELECT seller.id 
FROM seller 
INNER JOIN advert ON advert.seller_id = seller.id 
LEFT JOIN sale orphan ON advert.id = orphan.advert_id 
INNER JOIN sale accomplished_sale ON advert.id = accomplished_sale.advert_id 
WHERE orphan.id IS NULL 
GROUP BY seller.id 
HAVING ifnull(count(accomplished_sale.id), 0) = 0 
0

Après avoir vu votre requête, je pense que la requête ci-dessous vous donnera une sortie acceptée.

SELECT distinct seller.id 

FROM seller 

JOIN advert ON advert.seller_id = seller.id 

JOIN sale orphan ON advert.id = orphan.advert_id 

JOIN sale accomplished_sale ON advert.id = accomplished_sale.advert_id 

WHERE orphan.id IS NULL 

HAVING count(accomplished_sale.id) = 0