已经处理了这个查询已经有一段时间了,我在使用选择器时遇到了麻烦。我有一个属性表和一个日期表。日期表包含属性不可用的日期(以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子句,那么它将返回我需要的所有属性,但是日期范围不受用户搜索的限制。
答案 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
编辑:更改了空检查,以便它直接(隐式)在外连接中。