【发布时间】:2011-09-09 17:02:12
【问题描述】:
假设我有一个数据库来跟踪结构如下所示的浇水植物:
Table: "Plants"
ID Plants
----------------------------------
1 Roses
2 Daisies
3 Sunflowers
4 Marigolds
5 Daffodils
Table: "Maintenance"
ID Plant_ID Activity Date
-------------------------------------
1 1 Water 2011-09-09
2 1 Water 2011-08-02
3 2 Water 2011-08-15
4 3 Water 2010-07-01
5 4 Weed 2010-07-01
我正在尝试编写一个查询来告诉我们植物是否需要浇水,如果需要,浇水程度如何。换句话说:如果植物在过去 30 天内没有浇水,则返回“黄色”警告级别;如果在过去 60 天内没有浇水,则警告级别为“红色”。
这是我目前所处的位置:
SELECT Plants.Plants,
IF ( DATEDIFF(CURRENT_DATE, MAX(Maintenance.Date)) < 30 AND maintenance.type = "Water", '',
IF ((DATEDIFF(CURRENT_DATE, MAX(Maintenance.Date)) >= 60 AND maintenance.type = "Water") or maintenance.date IS NULL, 'Red', 'Yellow')
) AS `Water Warning`,
IF ( DATEDIFF(CURRENT_DATE, MAX(Maintenance.Date)) < 30 and maintenance.type = "Weed" , '',
IF ((DATEDIFF(CURRENT_DATE, MAX(Maintenance.Date)) >= 60 and maintenance.type = "Weed") or maintenance.date IS NULL, 'Red', 'Yellow')
) AS `Weeding Warning`
FROM `plants`
LEFT JOIN `maintenance` ON `maintenance`.`plant_id` = `plants`.`id`
GROUP BY `plants`.`id`;
但这会为“Roses”返回“红色”警告,而不是预期的空字符串,并且没有 Maintenance.Activity 的条件。请注意,同样的查询也需要对除草和其他活动执行类似的功能,因此在 WHERE 子句中进行过滤可能不是答案。
这是我想要的:
Results
ID Plants "Water Warning" "Weed Warning"
----------------------------------------------------
1 Roses "" "Red"
2 Daisies "Yellow" "Red"
3 Sunflowers "Red" "Red"
4 Marigolds "Red" ""
5 Daffodils "Red" "Red"
【问题讨论】:
-
"为了清楚起见,我将我正在处理的实际查询过分简化了,所以如果我在此处输入的内容中存在标点符号或其他问题,那不是导致问题的原因。”然后使用简化的测试用例重新运行您的测试,这样我们就知道在我们开始为您处理之前没有一些微不足道的复制错误。就这个问题而言,这些是您真正的疑问。
-
我已根据您的建议编辑了问题。我希望现在不要太复杂。
标签: mysql if-statement max intervals