DELIMITER $$ CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`routeProposal`(vTicketFk INT) RETURNS int(11) NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE vRouteFk INT; DECLARE vAddressFk INT; DECLARE vLanded DATE; DECLARE vZoneFk INT; DECLARE vSignificativeFriendship INT DEFAULT 6; DECLARE vVolumeMax DECIMAL(5,1) DEFAULT 10; SELECT addressFk, zoneFk, landed INTO vAddressFk, vZoneFk, vLanded FROM vn.ticket WHERE id = vTicketFk; -- Se inicia la selección de rutas posibles con aquellas cuyas agencias alguna vez han estado asociadas con nuestra zona DROP TEMPORARY TABLE IF EXISTS tmp.route; CREATE TEMPORARY TABLE tmp.route SELECT r.id routeFk, zf.friendship zoneFriendship FROM vn.route r JOIN cache.zoneAgencyFriendship zf ON zf.agencyModeFk = r.agencyModeFk WHERE friendship >= vSignificativeFriendship AND zf.zoneFk = vZoneFk AND r.created = vLanded ORDER BY friendship; -- Se eliminan aquellas que superan el volumen máximo DELETE r.* FROM tmp.route r JOIN (SELECT routeFk, sum(volume) volume FROM vn.saleVolume WHERE landed = vLanded GROUP BY routeFk) sub ON sub.routeFk = r.routeFk WHERE sub.volume > vVolumeMax; -- Se ordenan las que quedan en función con la afinidad del resto de consignatarios de cada ruta SELECT routeFk INTO vRouteFk FROM (SELECT r.routeFk, r.zoneFriendship, sum(af.friendship) friendshipSum FROM tmp.route r LEFT JOIN vn.ticket t ON t.routeFk = r.routeFk LEFT JOIN cache.addressFriendship af ON af.addressFk2 = t.addressFk AND af.addressFk1 = vAddressFk GROUP BY routeFk ORDER BY zoneFriendship DESC, friendshipSum DESC ) sub LIMIT 1; RETURN vRouteFk; END$$ DELIMITER ;