Таким образом, способ сделать это состоит в том, чтобы выполнить оба запроса и взять UNION наборов. Вот и все. Это действительно очень мало снижает производительность, потому что первый набор (который может создать> 5 строк) уже требуется, если в результате действительно более 5 строк.
Подробно - оригинальный ответ ниже
Для иллюстрации, вместо использования двух наборов данных, я просто использую 2 столбца в той же самой таблице примеров, для которых запрос показан ниже:
drop table if exists tbl1;
create table tbl1 (
id int,
name varchar(100),
distance1 float,
distance2 float
);
insert tbl1 values
( 3 , 'Earl of Sandwich ', 0.3, 0.1),
( 4 , 'Nails ''n More ', 0.8, 0.2),
( 22 , 'City Hotel ', 1.7, 1.7),
( 5 , 'Mighty Medicine ', 2.1, 0.5),
( 25 , 'Wonder Wings ', 2.5, 2.1),
( 6 , 'Jean Warehouse ', 2.7, 0.7),
( 9 , 'Ship Safe & Speedy ', 2.9, 0.9),
( 2 , 'Bagel Bonus ', 4.1, 1.2);
А запросы и результаты:
/* query 1 */
select id, name, distance1
from (
select *
from tbl1
where distance1 <= 2.0
order by distance1) a
union
select id, name, distance1
from (
select *
from tbl1
order by distance1
limit 5) b;
/* result 1 */
id;name;distance1
3;Earl of Sandwich ;0.3
4;Nails 'n More ;0.8
22;City Hotel ;1.7
5;Mighty Medicine ;2.1
25;Wonder Wings ;2.5
/* query 2 */
select id, name, distance2
from (
select *
from tbl1
where distance2 <= 2.0
order by distance2) a
union
select id, name, distance2
from (
select *
from tbl1
order by distance2
limit 5) b;
/* result 2 */
id;name;distance2
3;Earl of Sandwich ;0.1
4;Nails 'n More ;0.2
5;Mighty Medicine ;0.5
6;Jean Warehouse ;0.7
9;Ship Safe & Speedy ;0.9
2;Bagel Bonus ;1.2
22;City Hotel ;1.7
Производительность этого запроса так же высока, как и у него.
Первая часть UNION выбирает те, что <2 км. Это необходимо, так как вы хотите все совпадения. <br>
Следующая часть выбирает топ-5 и, если у вас есть индекс, собирать его тривиально.
Сочетание (UNION) обеих частей очень быстрое.