SQL: Aide sur LEFT OUTER JOIN
-
22-07-2019 - |
Question
Il semble que mon code SQL ne limite pas les résultats basés sur price
.
Dans mon précédent article, SQL: aidez-moi à optimiser mon code SQL , les gens ont indiqué que je devrais utiliser un LEFT OUTER JOIN.
SELECT homes.home_id,
address,
city,
state,
zip,
price,
photo_id,
photo_url_dir
FROM homes
LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
AND primary_photo_group_id = home_photo_group_id
AND home_photo_type_id =2
AND display_status = true
AND homes.price BETWEEN 500000 AND 1000000
Cependant, il affiche toujours les maisons dont le prix est < 500000
Je ne comprends pas. Pourquoi le code SQL ci-dessus affiche-t-il les maisons dont le prix est inférieur à 500 000 $ alors que j'ai la condition WHERE pour limiter exactement ce champ?
Merci de votre aide.
Ce que je veux faire
Je souhaite afficher à la fois les maisons avec et les maisons sans home_photo en fonction de critères tels que PRICE
entre X et Y ... ou SQFT
> Z. Mais ces critères doivent être appliqués à la fois aux maisons avec et à celles homes
sans home_photo
Est-ce correct?
SELECT homes.home_id,
address,
city,
state,
zip,
price,
photo_id,
photo_url_dir
FROM homes
LEFT OUTER JOIN home_photos ON homes.home_id = home_photos.home_id
AND homes.primary_photo_group_id = home_photos.home_photo_group_id
AND home_photos.home_photo_type_id =2
WHERE homes.display_status = true
AND homes.price BETWEEN 500000 AND 1000000
La solution
la dernière ligne doit utiliser WHERE not AND
WHERE homes.price BETWEEN 500000 AND 1000000
Le résultat final est le code SQL suivant:
SELECT
homes.home_id,
homes.address,
homes.city,
homes.state,
homes.zip,
homes.price,
home_photos.photo_id,
home_photos. photo_url_dir
FROM
homes
LEFT OUTER JOIN home_photos ON
homes.home_id = home_photos.home_id
AND homes.primary_photo_group_id = home_photos.home_photo_group_id
AND home_photos.home_photo_type_id =2
WHERE
homes.price BETWEEN 500000 AND 1000000
AND homes.display_status = true
EDIT
maintenant votre SQFT irait avant le OERE
AND home_photos.home_photo_type_id =2
AND SQFT <=2000
WHERE homes.price BETWEEN 500000 AND 1000000
Autres conseils
Utilisez les conditions de jointure après le mot-clé JOIN et toutes les autres conditions de filtre après la clause WHERE
Essayez ceci ...
SELECT homes.home_id,
address,
city,
state,
zip,
price,
photo_id,
photo_url_dir
FROM
homes
LEFT OUTER JOIN
home_photos ON homes.home_id = home_photos.home_id
AND
primary_photo_group_id = home_photo_group_id
WHERE
home_photo_type_id =2
AND
display_status = true
AND
homes.price BETWEEN 500000 AND 1000000
Vous avez toutes les conditions dans join
, certaines d'entre elles devraient figurer dans une clause where
pour limiter la requête. Quelque chose comme:
select
homes.home_id,
address,
city,
state,
zip,
price,
photo_id,
photo_url_dir
from
homes
left join
home_photos on homes.home_id = home_photos.home_id
where
primary_photo_group_id = home_photo_group_id and
home_photo_type_id = 2 and
display_status = true and
homes.price BETWEEN 500000 AND 1000000
Comme je ne sais pas de quelle table provient chaque champ, je ne sais pas si cela a du sens. Divisez les conditions entre le <=> et le <=> comme il convient.