Мне нужно создать функцию для возврата водителю с наименьшим количеством доставок. У меня есть таблица orders
, где драйвер вставлен в соответствующий столбец (значение может быть NULL), а также таблица ресторанов, для которых назначен драйвер. Структура таблицы драйверов и порядок столов приведены ниже.
Я пытался сделать:
SELECT driver, restaurant, count(driver)
FROM orders
GROUP BY restaurant, driver AS t;
Теперь я должен выбрать драйвер из таблицы драйверов с условиями driver.driver= t.driver and driver.restaurant=t.restaurant
и как выбрать драйвер, для которого count(driver)
является минимальным.
CREATE TABLE IF NOT EXISTS `driver` (
`Car_Number` varchar(10) NOT NULL,
`Driver_Name` varchar(50) NOT NULL,
`Model` varchar(50) NOT NULL,
`Restaurant_Name` varchar(50) NOT NULL,
PRIMARY KEY (`Car_Number`),
KEY `FK_driver_car` (`Model`),
KEY `FK_driver_restaurant` (`Restaurant_Name`),
CONSTRAINT `FK_driver_car` FOREIGN KEY (`Model`) REFERENCES `car` (`Model`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_driver_restaurant` FOREIGN KEY (`Restaurant_Name`) REFERENCES `restaurant` (`Restaurant_Name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `orders` (
`Order_ID` bigint(20) NOT NULL AUTO_INCREMENT,
`Customer_Name` varchar(50) NOT NULL,
`Restaurant_Name` varchar(50) NOT NULL,
`Is_Delivery` varchar(3) NOT NULL,
`Car_Number` varchar(10) DEFAULT NULL,
PRIMARY KEY (`Order_ID`),
KEY `FK_order_customer` (`Customer_Name`),
KEY `FK_order_restaurant` (`Restaurant_Name`),
KEY `FK_order_driver` (`Car_Number`),
CONSTRAINT `FK_order_customer` FOREIGN KEY (`Customer_Name`) REFERENCES `customer` (`Customer_Name`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `FK_order_driver` FOREIGN KEY (`Car_Number`) REFERENCES `driver` (`Car_Number`) ON DELETE SET NULL ON UPDATE SET NULL,
CONSTRAINT `FK_order_restaurant` FOREIGN KEY (`Restaurant_Name`) REFERENCES `restaurant` (`Restaurant_Name`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=latin1;
Если у меня в заказе один водитель с, скажем, 2 доставкой и один с 4 (для того же ресторана), я ожидаю, что функция вернет car_number(driver id)
для водителя, у которого 2.
CREATE DEFINER=root@localhost TRIGGER select_driver
AFTER INSERT ON orders
FOR EACH ROW BEGIN
set @orderid = ( SELECT max(order_id) from orders );
SET @restauranatname= ( SELECT Restaurant_Name from orders
WHERE order_id=@orderid );
set @drivername = ( SELECT find_lazy_driver('@restauranatname') );
SET @car_number = ( SELECT car_number FROM driver
WHERE driver_name=@drivername );
update orders SET car_number= @car_number
WHERE Order_ID = @orderid;
END