Как посчитать, сколько рабочих в отпуске - mysql - PullRequest
0 голосов
/ 08 апреля 2019

Привет всем в базе 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. ГдеДолжен ли я изменить то, что будет работать.Спасибо за любые советы и помощь.

1 Ответ

0 голосов
/ 09 апреля 2019

Первое, что вам нужно сделать, это убедиться, что ваш запрос вернет желаемый результат.Давайте сначала немного проверим.

Здесь я извлекаю ваш первый 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.Это вернет желаемый результат.Однако из-за ограниченности данных я не уверен, что приведенный выше запрос будет полезен в долгосрочной перспективе.Если это так, то это хорошо.Но если нет, пожалуйста, сообщите мне о других условиях, которые вы хотели бы добавить в запрос.

...