2010-08-30 63 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工作!

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

嘿西蒙, 感謝您的答案,但我確實嘗試過和一些類似的變化(例如:d.timestamp =''等)。仍然沒有骰子=/ – erbaker 2010-08-30 23:12:33

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 2010-08-30 23:16:53

1

嘗試將標準中的JOIN

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

這應該允許所有properties退換,但只參加是日期範圍內的人。

+0

Joe, 謝謝!我剛剛提交了我的答案,但我會爲此讚揚你。 (必須打敗我吧:P) – erbaker 2010-08-30 23:23:25

+0

哈哈,時機不錯!謝謝 – 2010-08-30 23:24:38

相關問題