嗨大家在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.我应该在哪里改变它的工作方式。感谢您的任何建议和帮助。
您需要做的第一件事是确保您的查询确实返回了您想要的结果。我们先做一些检查。
在这里,我提取你的第一个INNER JOIN
并改为SELECT *
:
SELECT * FROM leave
INNER JOIN order_status
ON order_status.ID_WORKER = leave.ID_WORKER;
然后我添加第三个连接;
SELECT * FROM leave
INNER JOIN order_status
ON order_status.ID_WORKER = leave.ID_WORKER
INNER JOIN orders;
注意:你的第二个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
。这将返回您想要的结果。但是,由于数据有限,我不确定上面的查询从长远来看是否有用。如果确实如此,那就是好事。但如果没有,请向我反馈您想在查询中添加的其他条件。