Мне нужна «небольшая» помощь с SQL-запросом (MySQL).SQL-запрос, соединяющий несколько таблиц (MySQL)
У меня есть следующие таблицы:
COURIERS
стол:
+------------+ | COURIER_ID | +------------+
DELIVERIES
стол:
+-------------+------------+------------+ | DELIVERY_ID | COURIER_ID | START_DATE | +-------------+------------+------------+
стола:
+----------+-------------+-------------+ | ORDER_ID | DELIVERY_ID | FINISH_DATE | +----------+-------------+-------------+
COORDINATES
стол:
+-------------+-----+-----+------+ | DELIVERY_ID | LAT | LNG | DATE | +-------------+-----+-----+------+
В реальной базе данных у меня есть несколько столбцов в каждой таблице, но для этого примера указанных столбцов являются достаточно.
Что мне нужно?
SQL-запрос, который возвращает все курьеров [
COURIER_ID
], их последний доставка [DELIVERY_ID
] (на основе последнегоSTART_DATE
), то доставка Последняя координата [LAT
иLNG
] (на основе последнегоDATE
) и количество оставшихся ордеров (всего заказов последней поставки, которые не имеютFINISH_DATE
).курьер не может иметь никаких поставок, в данном случае я хочу
DELIVERY_ID
= NULL,LAT
= NULL иLNG
= NULL в результате.Подающая не может иметь никаких координат, в данном случае я хочу
LAT
= NULL иLNG
= NULL в результате.
Что я мог сделать?
SELECT c.`COURIER_ID`,
d.`DELIVERY_ID`,
r.`LAT`,
r.`LNG`,
(SELECT COUNT(DISTINCT `ORDER_ID`)
FROM `ORDERS`
WHERE `DELIVERY_ID` = d.`DELIVERY_ID`
AND `FINISH_DATE` IS NULL) AS REMAINING_ORDERS
FROM `COURIERS` AS c
LEFT JOIN `DELIVERIES` AS d USING (`COURIER_ID`)
LEFT JOIN `COORDINATES` AS r ON r.`DELIVERY_ID` = d.`DELIVERY_ID`
WHERE (CASE WHEN
(SELECT MAX(`START_DATE`)
FROM `DELIVERIES`
WHERE `COURIER_ID` = c.`COURIER_ID`) IS NULL THEN d.`START_DATE` IS NULL ELSE d.`START_DATE` =
(SELECT MAX(`START_DATE`)
FROM `DELIVERIES`
WHERE `COURIER_ID` = c.`COURIER_ID`) END)
AND (CASE WHEN
(SELECT MAX(`DATE`)
FROM `COORDINATES`
WHERE `DELIVERY_ID` = d.`DELIVERY_ID`) IS NULL THEN r.`DATE` IS NULL ELSE r.`DATE` =
(SELECT MAX(`DATE`)
FROM `COORDINATES`
WHERE `DELIVERY_ID` = d.`DELIVERY_ID`) END)
GROUP BY c.`COURIER_ID`
ORDER BY d.`START_DATE` DESC
Проблема заключается в том, что этот запрос очень медленно (от 5 до 20 секунд), когда у меня есть более 5к COORDINATES
и не возвращает все курьеры иногда.
Большое вам спасибо за любое решение.
Вы действительно не задавали вопрос. Похоже, вы ищете помощь в оптимизации запроса, который вы уже писали. Вы должны уточнить свой вопрос. Если вы ищете помощь для оптимизации запроса, вы должны указать, каковы ваши желаемые результаты. – axiopisty
Я считаю, что это вопрос, потому что этот запрос работает не так, как мне нужно, независимо от его производительности. Производительность - лишь одна из проблем. Благодарю. –
Должны ли вы возвращать все результаты в одном запросе базы данных? Или было бы хорошо, если бы вы отправили пару запросов в базу данных, пока конечным результатом является правильный набор данных? – axiopisty