通过LEFT JOIN和WHERE选择器选择中断日期

时间:2010-08-30 23:07:04

标签: php mysql

已经处理了这个查询已经有一段时间了,我在使用选择器时遇到了麻烦。我有一个属性表和一个日期表。日期表包含属性不可用的日期(以DATE和TIMESTAMP格式)。 WHERE子句仅选择具有条目的属性。这是一个问题,因为它还应该选择具有条目的属性,因为它们100%可供租用。

这是一个基本查询:

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个属性(因为它有9月份的一半被涂黑),而没有其他2个没有任何日期的9月被淘汰。如果我省略了WHERE子句,那么它将返回我需要的所有属性,但是日期范围不受用户搜索的限制。

4 个答案:

答案 0 :(得分:1)

尝试将标准放在JOIN

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

这应该允许返回所有properties,但只会加入日期范围内的{{1}}。

答案 1 :(得分: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

这将是正确的查询。再次感谢!!

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分: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 

编辑:更改了空检查,以便它直接(隐式)在外连接中。