DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` FUNCTION `vn`.`client_getGeo`(vSelf INT)
	RETURNS int(11)
	DETERMINISTIC
BEGIN
/**
 * Returns the geo for the passed client.
 *
 * @param vSelf The address id
 * @return The geo id
 */
 	DECLARE vGeoFk INT;

	SELECT p.geoFk INTO vGeoFk
		FROM client c
			JOIN town t ON t.provinceFk = c.provinceFk
			JOIN postCode p ON p.townFk = t.id
				AND (p.code = c.postcode OR c.postcode IS NULL)
			JOIN zoneGeo zg ON zg.id = p.geoFk
		WHERE c.id = vSelf
		ORDER BY (c.city SOUNDS LIKE t.name) DESC,
			(p.code = c.postcode) DESC
		LIMIT 1;

	RETURN vGeoFk;
END$$
DELIMITER ;
