SQL: Справка по левому внешнему соединению - PullRequest
1 голос
/ 24 июня 2009

Похоже, мой SQL не ограничивает результаты на основе price.

В моем предыдущем посте SQL: помогите мне оптимизировать мой SQL , люди указали, что я должен использовать 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

Тем не менее, он по-прежнему показывает дома, цена которых <500000 </h2> Я не понимаю. Почему в приведенном выше SQL отображаются дома с ценой менее 500000, когда у меня есть условие WHERE для ограничения именно этого поля. Спасибо за вашу помощь. Что я хочу сделать

Я хочу отобразить как дома с домами, так и дома без home_photo на основе таких критериев, как PRICE между X и Y ... или SQFT> Z. Но эти критерии необходимо применять как к тем домам с homes без home_photo

Это правильно?

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

Ответы [ 4 ]

19 голосов
/ 24 июня 2009

последняя строка должна использовать ГДЕ НЕ И

WHERE homes.price BETWEEN 500000 AND 1000000

Конечным результатом является следующий SQL:

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

РЕДАКТИРОВАТЬ

теперь ваш SQFT будет идти до ГДЕ

AND home_photos.home_photo_type_id =2 
AND SQFT <=2000 
WHERE homes.price BETWEEN 500000 AND 1000000
0 голосов
/ 24 июня 2009

У вас есть все условия в join, некоторые из них должны быть в предложении where, чтобы ограничить запрос. Что-то вроде:

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

Поскольку я не знаю, из какой таблицы происходит каждое поле, я не знаю, имеет ли смысл приведенное выше. Разделите условия между join и where, как они подходят.

0 голосов
/ 24 июня 2009

Попробуйте это ...

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
0 голосов
/ 24 июня 2009

Использовать условия соединения после ключевого слова JOIN и все другие условия фильтра после предложения WHERE

...