Имам нужда от "малко" помощ за 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 секунди), когато имам над 5k 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