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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top