如何计算有多少工人休假 - mysql

问题描述 投票:0回答:1

嗨大家在mysql基地我有离开表

+--------+---------+---------+-------------+----------+--------------------------
|ID_LEAVE|ID_WORKER| FNAME   | LNAME | BEGIN_DATE         | END_DATE            | 
+--------+---------+---------+---------+-------------+--------------------+------
| 1      |   4     | LEON    | SPEED |2019-03-20 07:00:00 |2019-03-21 15:00:00  | 
+--------+---------+---------+-------------+----------+--------------------------

“工人表”

+----------+---------+---------+
|ID_WORKER |  FNAME  | LNAME   |
+----------+---------+----------
| 4        |  LEON   |  SPEED  |
| 6        |  JACK   |  FAR    |
+----------+---------+---------+

“订单”表:

+----------+--------------+---------------+
|ID_ORDER  |  DESC_ORDER  | NUMBER_ORDER  |
+----------+--------------+---------------+
| 20       |  TEST        |  TEST         |
+----------+--------------+---------------+

“订单状态”表:

+----------+---------+---------+---------------------+-------------------+
| Id_status|ID_WORKER| ID_ORDER| BEGIN_DATE          | END_DATE          | 
+----------+---------+---------+----------+------------+---------+--------
| 30       |   4     |    20   |2019-03-18 06:50:35  |2019-03-18 15:21:32|
| 31       |   4     |    20   |2019-03-19 06:44:35  |2019-03-19 15:13:32|
| 32       |   4     |    20   |2019-03-20 06:45:33  |2019-03-20 15:11:23|
| 33       |   4     |    20   |2019-03-21 06:50:01  |2019-03-21 15:20:44|
| 34       |   4     |    20   |2019-03-22 06:50:20  |2019-03-22 12:22:33|
| 35       |   6     |    20   |2019-03-18 06:45:11  |2019-03-18 15:14:45|
| 36       |   6     |    20   |2019-03-19 06:55:32  |2019-03-19 15:33:45|
| 37       |   6     |    20   |2019-03-20 06:50:22  |2019-03-20 15:10:32|
| 38       |   6     |    20   |2019-03-21 06:53:23  |2019-03-21 15:11:44|
| 39       |   6     |    20   |2019-03-22 06:54:11  |2019-03-22 11:23:45|
+----------+---------+---------+------------+---------+------------------+

我想做什么?

我想要计算在指定日期有多少工人休假,例如20-03-2019,只有1名工人休假。我试过这个查询:

SELECT COUNT(leave.ID_WORKER) AS 'NUMBER OF WORKERS IN LEAVE' 
FROM leave
INNER JOIN order_status
ON order_status.ID_WORKER = leave.ID_WORKER 
INNER JOIN orders
WHERE DATE(order_status.BEGIN_DATE) = '2019-03-20' AND DATE(order_status.END_DATE) ='2019-03-20' AND orders.NUMBER_ORDER = 'TEST'

然后我有:

NUMBER OF WORKERS IN LEAVE = 1

为2019-03-21我得到:

 NUMBER OF WORKERS IN LEAVE = 0

但是对于2019-03-19我有:

 NUMBER OF WORKERS IN LEAVE = 1

为什么在2019-03-21这样的工作人数应该是1,2019-03-19应该是0.我应该在哪里改变它的工作方式。感谢您的任何建议和帮助。

mysql date count where
1个回答
0
投票

您需要做的第一件事是确保您的查询确实返回了您想要的结果。我们先做一些检查。

在这里,我提取你的第一个INNER JOIN并改为SELECT *

SELECT * FROM leave
INNER JOIN order_status
ON order_status.ID_WORKER = leave.ID_WORKER;

这是我在执行上述查询时得到的结果。 Result 1

然后我添加第三个连接;

SELECT * FROM leave
INNER JOIN order_status
ON order_status.ID_WORKER = leave.ID_WORKER
INNER JOIN orders;

这将从orders表中添加三个额外的列。请参考下面的照片:Result 2

注意:你的第二个INNER JOIN没有ON条件。我建议您通过添加ON order_status.ID_ORDER=orders.ID_ORDER来修复该部分。

到目前为止,所有结果都给出了5行。这5行来自你的order_status表,因为你使用leave的关系加入ID_WORKER表,它将返回与该字段匹配的所有内容。

现在我们用第一个WHERE测试你的查询:

SELECT COUNT(leave.ID_WORKER) AS 'NUMBER OF WORKERS IN LEAVE' 
FROM leave
INNER JOIN order_status
ON order_status.ID_WORKER = leave.ID_WORKER 
INNER JOIN orders ON order_status.ID_ORDER=orders.ID_ORDER -- (I've added this condition)
WHERE DATE(order_status.BEGIN_DATE) = '2019-03-20';

这个WHERE条件在这里不起作用,因为你从BEGIN_DATE表采取order_status。如果你检查你的order_status表,ID_WORKER=4有2019-03-19到2019-03-21之间所有日期的数据。这意味着无论你投入什么日期,你都会得到NUMBER OF WORKERS IN LEAVE = 1的结果。

我已经使用您的示例数据测试了您的查询,并且我在所有日期都获得了NUMBER OF WORKERS IN LEAVE = 1。我不知道你是怎么在NUMBER OF WORKERS IN LEAVE = 0上获得2019-03-21的。

所以,在完成所有这些之后,我设法做了这个查询:

SELECT COUNT(leave.ID_WORKER) AS 'NUMBER OF WORKERS IN LEAVE'
FROM leave
INNER JOIN order_status
ON order_status.ID_WORKER = leave.ID_WORKER 
AND DATE(order_status.BEGIN_DATE) BETWEEN DATE(leave.BEGIN_DATE) AND DATE(leave.END_DATE) -- this condition added
INNER JOIN orders ON order_status.ID_ORDER=orders.ID_ORDER
WHERE DATE(order_status.BEGIN_DATE) = '2019-03-21' 
AND DATE(order_status.END_DATE) ='2019-03-21' 
AND orders.NUMBER_ORDER = 'TEST';

我在查询上所做的是我添加了另一个条件是你的第一个JOIN。这将返回您想要的结果。但是,由于数据有限,我不确定上面的查询从长远来看是否有用。如果确实如此,那就是好事。但如果没有,请向我反馈您想在查询中添加的其他条件。

© www.soinside.com 2019 - 2024. All rights reserved.