Мне нужна "небольшая" помощь с запросом SQL (MySQL).
У меня есть следующие таблицы:
COURIERS
таблица:
+------------+ | COURIER_ID | +------------+
DELIVERIES
таблица:
+-------------+------------+------------+ | DELIVERY_ID | COURIER_ID | START_DATE | +-------------+------------+------------+
ORDERS
таблица:
+----------+-------------+-------------+ | 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
и иногда не возвращает всех курьеров.
Большое спасибо за любое решение.
delivery's last coordinates
иcourier's last deliveries
. Чем соединить их вместе. Он должен быть более эффективным. Существует решение получения первой или последней строки в определенной группе с помощью MySql, на которое вы можете ссылаться - person Jaugar Chang   schedule 05.09.2014FINISH_DATE
в таблицеDELIVERIES
бесполезна. Я отредактирую вопрос. - person Lucas NN   schedule 05.09.2014