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