以下是我要完成的任务:
找到给定位置最近的可用车辆。
我有一张table给你 vehicle
还有一张table location
具体如下:
CREATE TABLE location
(location_id numeric(8,0) UNIQUE NOT NULL,
address varchar(100),
latitude float,
longitude float,
PRIMARY KEY(location_id)
);
CREATE TABLE vehicle
(license_plate char(6) UNIQUE NOT NULL,
make varchar(30) NOT NULL,
model varchar(30) NOT NULL,
year numeric(4,0) NOT NULL CHECK(year>1990),
state char(2) NOT NULL,
capacity int NOT NULL,
last_location numeric(8,0) DEFAULT NULL,
FOREIGN KEY(last_location) REFERENCES location(location_id) ON DELETE
CASCADE ON UPDATE CASCADE,
PRIMARY KEY(license_plate)
);
我编写了一个查询,它调用一个函数来循环 vehicle
表中,计算给定位置的距离并返回 license_plate
最小距离的汽车。
SELECT @locationA := 11111111;
SET @loc_lat = (SELECT latitude FROM location WHERE location_id =
@locationA);
SET @loc_long = (SELECT longitude FROM location WHERE location_id =
@locationA);
SELECT license_plate, make, model FROM vehicle
WHERE license_plate = find_car(@loc_lat, @loc_long);
DELIMITER $$
CREATE FUNCTION find_car(loc_lat float, loc_long float) RETURNS char
BEGIN
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
DECLARE CUR_DIST float DEFAULT 1000000000;
DECLARE car_lat NUMERIC;
DECLARE car_long NUMERIC;
DECLARE dist float;
DECLARE closest_car char(6);
DECLARE car_temp char(6);
DECLARE loc_temp numeric;
DECLARE car_cursor CURSOR FOR SELECT license_plate, last_location FROM
vehicle;
OPEN car_cursor;
car_loop: LOOP
FETCH car_cursor INTO car_temp, loc_temp;
SET car_lat = (SELECT latitude FROM location WHERE location_id =
loc_temp);
SET car_long = (SELECT longitude FROM location WHERE location_id =
loc_temp);
SET dist = (SELECT ST_Distance_Sphere(
point(loc_lat, loc_long),
point(car_lat, car_long)
) * .000621371192);
IF dist < CUR_DIST THEN
SET closest_car = car_temp;
SET CUR_DIST = dist;
END IF;
END LOOP;
CLOSE car_cursor;
RETURN(closest_car);
END $$
DELIMITER ;
现在,它什么也没有返回,我不太清楚为什么。我对sql还比较陌生,所以提前谢谢!
1条答案
按热度按时间vnjpjtjt1#
我的建议是首先尝试一种基于集合的方法,看看它的性能如何。
关于为什么会在这里找到一些很好的见解。
总体策略:针对每个
location_id
,找到下一个最近的location_id
一些具体策略:使用jpgunter的
GETDISTANCE
功能(代码如下)单击此处查看上下文中的代码
计算所有
location_id
使用自联接到location
table确定“太远”的任意距离,并排除超出该距离的所有内容
这有助于提高性能
从结果中选取最小距离
这是自连接到
location
表和“太远”标准。。。这是jpgunter的getdistance函数。。。
您可能需要考虑修改字段名
year
因为它是一个保留字。您可能会发现,如果/当数据库增长时,这些名称过于笼统:
location
address
latitudelongitude
但是,我不知道你的数据库。可能是您的表名和字段名非常适合您的需要。希望这有帮助!