mysql返回所有行,无论数据是否存在

时间:2018-12-07 10:15:31

标签: mysql rdbms

这是表格的一部分,我将从中检索过去3个月(包括当月)的数据

+-------------+-----------------------+
| Wo_id       | updated_at            | 
+-------------+-----------------------+
|           1 | 2018-12-05 10:38:06   |
|           2 | 2018-12-02 15:21:17   |
|           3 | 2018-12-01 22:18:53   |
|           4 | 2018-10-25 10:38:06   |
|           5 | 2018-10-18 15:21:17   |
|           6 | 2018-10-16 22:18:53   |
|           7 | 2018-10-19 10:26:19   |
|           8 | 2018-10-27 07:06:52   |
|           9 | 2018-09-25 11:35:09   |
|          10 | 2018-09-18 12:54:27   |

我尝试的查询是

SELECT MONTHNAME(updated_at) month,YEAR(updated_at) year_name, 
MONTH(updated_at) month_no, COUNT(*) work_orders 
FROM work_orders where updated_at >= last_day(now()) + interval 1 day - interval 3 month 
GROUP by MONTH(updated_at),YEAR(updated_at) 
ORDER BY MONTH(updated_at) DESC

我得到的输出是

+-------------+-------------+----------+-------------+
| month       | year_name   | month_no | work_orders |
+-------------+-------------+----------+-------------+
| December    |      2018   | 12       |      3      |
| October     |      2018   | 10       |      5      |
| September   |      2018   | 9        |      2      |

您可以看到查询忽略了11月,因为其数据不在表中。为了完成3个月的周期,它包含September,这是错误的。我想要这样的输出

+-------------+-------------+----------+-------------+
| month       | year_name   | month_no | work_orders |
+-------------+-------------+----------+-------------+
| December    |      2018   | 12       |      3      |
| November    |      2018   | 9        |      0      |
| October     |      2018   | 10       |      5      |

有人可以指导我修改上述查询。谢谢

1 个答案:

答案 0 :(得分:2)

您需要创建最近三个月的表,然后public static void main(String[] args) { JsonParser jsonParser = new JsonParser(); String log = "[{\"car\": \"ford\"}, {\"car\": \"nissan\"}, {\"car\": \"bmw\"}]"; JsonArray jsonObject = jsonParser.parse(log).getAsJsonArray(); for (JsonElement jsonElement : jsonObject) System.out.println(jsonElement.getAsJsonObject().get("car").getAsString()); } 将其创建到工作订单表(使用工作订单的月份)以获取所需的结果。可以使用LEFT JOIN生成最近3个月的表格:

UNION

输出(截至2018年12月7日):

SELECT NOW() AS month
UNION
SELECT NOW() - INTERVAL 1 MONTH
UNION
SELECT NOW() - INTERVAL 2 MONTH

请注意,可以从日期中减去1个月,就像天数大于上个月的天数一样,它将向下调整以使日期有效(请参见manual

最终查询将变为:

month
2018-12-07 11:06:15
2018-11-07 11:06:15
2018-10-07 11:06:15

请注意,我们不需要SELECT MONTHNAME(m.month) AS month_name, YEAR(m.month) AS year_name, MONTH(m.month) AS month_no, COUNT(wo.Wo_id) work_orders FROM (SELECT NOW() AS month UNION SELECT NOW() - INTERVAL 1 MONTH UNION SELECT NOW() - INTERVAL 2 MONTH) m LEFT JOIN work_orders wo ON MONTH(wo.updated_at) = MONTH(m.month) AND YEAR(wo.updated_at) = YEAR(m.month) GROUP by m.month, year_name ORDER BY m.month DESC 子句,因为WHERE表中的值将数据限制在我们感兴趣的最近3个月内。我们也使用{{1} },这样即使每个月没有工单,我们也可以得到每个月的结果。

输出:

month

Demo on dbfiddle