I have a stored procedure that searches for user preferences based on the fact that they can select multiple locations to which they want to search. Thus, for each location, the query must search for search results within the region. Currently, the procedure returns only 1 result. In addition, I would like to be able to implement some ranking system in order to sort the results as one combined feed. I understand that if I use a while loop, this will group the results by location, which I don't want. What is the best way to restructure this procedure so that the results from the three queries are combined and allow me to streamline the results flexibly?
DELIMITER $$
DROP PROCEDURE IF EXISTS `geodist` $$
CREATE PROCEDURE geodist (IN userid INT) BEGIN
DECLARE mylon DOUBLE; DECLARE mylat DOUBLE;
DECLARE lon1 FLOAT; DECLARE lon2 FLOAT;
DECLARE lat1 FLOAT; DECLARE lat2 FLOAT;
DECLARE dist INT;
DECLARE no_more_locations INT; DECLARE l_location_count INT;
DECLARE location_cursor CURSOR FOR
SELECT geo_lat, geo_long, distance
FROM activity_location_preferences
INNER JOIN activity_preferences ON activity_location_preferences.preference_id = activity_preferences.id
WHERE activity_preferences.user_id = userid
ORDER BY activity_preferences.id ASC
LIMIT 3;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_locations = 1;
SET no_more_locations = 0;
OPEN location_cursor;
location_loop:WHILE(no_more_locations = 0) DO
FETCH location_cursor INTO mylat, mylon, dist;
IF no_more_locations = 1 THEN
LEAVE location_loop;
END IF;
SET l_location_count = l_location_count+1;
SET lon1 = mylon - dist / abs(cos(radians(mylat)) * 69);
SET lon2 = mylon + dist / abs(cos(radians(mylat)) * 69);
SET lat1 = mylat - (dist / 69);
SET lat2 = mylat + (dist / 69);
SELECT `id`, `user_id`, `activity`, `geo_lat`, `geo_long`, `data`, `date_created`,
7912 * ASIN(SQRT(POWER(SIN((mylat - activity_logs.geo_lat) * pi()/180 / 2), 2) +
COS(mylat * pi()/180) * COS(activity_logs.geo_lat * pi()/180) * POWER(SIN((mylon - activity_logs.geo_long) * pi()/180 / 2), 2) )) as distance
FROM activity_logs
WHERE 1
AND activity_logs.geo_long BETWEEN lon1 AND lon2
AND activity_logs.geo_lat BETWEEN lat1 AND lat2
HAVING distance < dist ORDER BY date_created DESC LIMIT 100;
END WHILE location_loop;
CLOSE location_cursor;
SET no_more_locations = 0;
END $$
DELIMITER ;