假设我有一个数据库来跟踪其结构如下的浇水植物:

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`;


但这将为“玫瑰”返回“红色”警告,而不是预期的空字符串,并且对于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"

最佳答案

使用下面的语句,您只需要将表与植物名称连接在一起。

SELECT *,

CASE
    WHEN DATEDIFF(CURRENT_DATE, DATE) >= 60 THEN 'RED'
    WHEN DATEDIFF(CURRENT_DATE, DATE) >= 30 THEN 'YELLOW'
END AS FLAG
FROM test_table

10-07 20:09
查看更多