2010-08-30 2 views
2

Работает над этим запросом в течение некоторого времени, и у меня возникают проблемы с селектором. У меня есть таблица свойств и таблицы дат. Таблица дат содержит даты (в формате DATE и TIMESTAMP), которые НЕ ДОСТУПНЫ для этого свойства. Предложение WHERE выбирает только свойства, имеющие записи. Это проблема, потому что она также должна выбирать свойства, которые имеют ноль записей, потому что они на 100% доступны для аренды.Выбор даты затемнения через селектор LEFT JOIN и WHERE

Вот основной вопрос:

SELECT p.*, p.land_id AS landCode, p.id AS propertyId, d.*, COUNT(d.id) AS land 
FROM `properties` AS p 
LEFT JOIN `dates` AS d ON `p`.`id` = `d`.`land_id` 
WHERE (`d`.`timestamp` BETWEEN '1283317200' AND '1285909199') 
GROUP BY `p`.`id ` 
ORDER BY `land` ASC 

возвращает только 1 свойство (поскольку он имеет половину сентября затемнены), а не другие 2, которые не имеют каких-либо дат в сентябре затемнены. Если я не укажу предложение WHERE, он вернет все свойства, как мне нужно, но тогда диапазон дат не ограничен поиском пользователя.

ответ

1

Спасибо, что помогли ребятам. Я решил добавить селектор в фактический JOIN вместо всего запроса и IT WORKED!

SELECT p.*, p.land_id AS landCode, p.id AS propertyId, d.*, COUNT(d.id) AS land 
FROM `properties` AS p 
LEFT JOIN `dates` AS d ON `p`.`id` = `d`.`land_id` AND `d`.`timestamp` BETWEEN '1283317200' AND '1285909199' 
GROUP BY p.id 
ORDER BY land ASC 

Это был бы правильный запрос. Еще раз спасибо!!

0

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

WHERE (d.timestamp IS NULL OR d.timestamp between '1283317200' and '1285909199') 
+0

Hey Simon, Спасибо за ответ, но я попробовал это и некоторые подобные варианты (например: d.timestamp = '' и т. Д.). Все еще нет костей =/ – erbaker

0

Вы должны добавить «или» выражение, непосредственно слева присоединиться. Как это:

SELECT p.*, p.land_id AS landCode, p.id AS propertyId, d.*, COUNT(d.id) AS land 
FROM `properties` AS p 
LEFT JOIN `dates` AS d ON `p`.`id` = `d`.`land_id` and d.timestamp between '1283317200' AND '1285909199' 
GROUP BY `p`.`id ` 
ORDER BY `land` ASC 

Изменить: изменил проверку нулевой, так что она непосредственно (неявно) в внешнего соединения.

+0

Эй, спасибо за ответ. Саймон сказал выше, и это, похоже, не принимало. – erbaker

1

Попробуйте положить критерии в РЕГИСТРИРУЙТЕСЬ

LEFT JOIN `dates` AS d ON `p`.`id` = `d`.`land_id` 
    AND (`d`.`timestamp` BETWEEN '1283317200' AND '1285909199') 

Это должно позволить всем properties быть возвращены, но присоединятся только те, которые находятся в пределах диапазона дат.

+0

Joe, Спасибо! Я только что представил свой ответ, но я дам вам кредит на это. (должно быть, просто избил меня: P) – erbaker

+0

Ха-ха, приятный момент! благодаря –

Смежные вопросы