总之,执行此操作的方法是运行两个查询并获取集合的UNION.而已.这样做的确很少有性能损失,因为如果结果中确实有超过5行,则已经需要第一组(可以产生> 5行).
详细 – 原始答案如下
为了说明,我只使用同一样本表中的2列,而不是使用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部分选出了<2km.这是必要的,因为你想要所有的比赛.下一部分选择前5名并假设你有一个索引,这是很容易收集的.两个部分的组合(UNION)非常快.