MySQL: LEFT JOIN .. tout sélectionner dans le tableau 1 même s’il n’y en a pas dans le tableau 2?
Question
Je rejoins quelques tables pour une sélection
S'il n'y a rien qui corresponde dans les 2e, 3e et 4e tables, je veux tout de même extraire les résultats tant que la première table a une correspondance. Je pensais que LEFT JOIN l’avait fait, mais ce n’est pas le cas.
Voici la requête complète:
SELECT cart_product.*, prod_drop_products.prod_drop_product_name, everlon_sheet.*, cart_product.product_id AS product_id
FROM cart_product
LEFT JOIN everlon_sheet ON cart_product.product_id = everlon_sheet.product_id
LEFT JOIN prod_drop_products ON cart_product.product_id = prod_drop_products.product_id
LEFT JOIN prod_drop ON prod_drop.prod_drop_id = prod_drop_products.prod_drop_id
WHERE prod_drop.prod_drop_name = "Carat Weight" AND cart_product.product_brand = "everlon"
ORDER BY cart_product.product_manufacturer_num
qui tire 316 résultats
Voici la requête sans les jointures:
SELECT cart_product.*
FROM cart_product
WHERE cart_product.product_brand = "everlon"
ORDER BY cart_product.product_manufacturer_num
qui tire 362 résultats
J'ai l'impression que cela se produit à cause de ma clause WHERE prod_drop.prod_drop_name = "quotation en poids carat" dans le dossier JOIN. Mais existe-t-il un moyen d'extraire ce dont j'ai besoin dans la requête ci-dessus tout en extrayant tout de la première table (le plus à gauche, cart_product) même si rien ne correspond aux autres tables?
Merci !!
La solution
S'il n'y a pas de correspondance à droite prod_drop.prod_drop_name sera null
Ajouter OR prod_drop.prod_drop_name IS NULL devrait résoudre votre problème.
Autres conseils
essayer
WHERE prod_drop.prod_drop_name = "Carat Weight" or prod_drop.prod_drop_name is null
Changer
WHERE prod_drop.prod_drop_name = "Carat Weight" AND cart_product.product_brand = "everlon"
à
WHERE (prod_drop.prod_drop_name = "Carat Weight" OR prod_drop.prod_drop_name IS NULL) AND cart_product.product_brand = "everlon"
La requête renvoie également une correspondance s'il n'y a pas de valeur correspondante dans prod_drop.