2011-05-13 78 views
1

当我运行以下查询时,它只显示1行。基于“created_date”条件,其中,如果我删除“created_date”条件,只是保持“status_change_date”条件,它显示3行。提供错误结果的SQL查询

我想查看所有在指定时间内创建或修改的项目。我无法找到什么错在查询周围的日期条款

`SELECT DISTINCT products.id AS product, status.id AS stat, COUNT(*) AS total FROM items 
     INNER JOIN products ON (items.fk_product_id = products.id) 
     INNER JOIN status ON (items.fk_status = status.id) 
     WHERE DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
     OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13' 
     AND status.id = 2 
     GROUP BY products.name, status.name order by products.name`

回答

1

你的WHERE子句看起来错误,请尝试:

WHERE 
    (DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
    OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13') 
     AND status.id = 2 
     GROUP BY products.name, status.name order by products.name 
+0

当我拿走status.id = 2,看它再次1行显示在整个结果status.id = 2的所有状态设置 – Johal 2011-05-13 16:59:08

+0

我删除DISTINCT仍然是相同的 – Johal 2011-05-13 17:07:21

+0

@Johal你是否尝试在你的where子句中放置parens?您的查询可能存在其他问题,但您正在执行x OR y AND z而不是(x或y)和z。如果change_date在日期范围内,或者创建的日期在日期范围内且状态ID为2,那么您写入的方式只会返回记录。我认为您想要返回更改日期或修改日期的记录在日期范围内并且状态ID是2。 – rsbarro 2011-05-13 18:10:47

1

用括号括起来:

WHERE (DATE(items.status_change_date) BETWEEN '2011-04-13' AND '2011-05-13' 
    OR DATE(items.created_date) BETWEEN '2011-04-13' AND '2011-05-13') 
    AND status.id = 2 
1

我有一种感觉的条件正在evalulated这样

status_change_date or (created_date and status.id = 2) 

你可能会尝试使用圆括号来指定您的条件分组

(DATE(items.status_change_date)... OR DATE(items.created_date)...) 
    AND status.id = 2