[英]A query to find nearest distance trainers
表名:course_trainer_combination
創建表查詢:
create table `course_trainer_combination` (
`id` double ,
`course` varchar (150),
`trainer` varchar (150),
`distance` float
);
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('1','Course A','Trainer A','110.00');
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('2','Course A','Trainer B','105.00');
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('3','Course A','Trainer C','115.00');
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('4','Course B','Trainer A','112.00');
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('5','Course B ','Trainer B','108.00');
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('6','Course B','Trainer C','109.00');
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('7','Course C','Trainer A','124.00');
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('8','Course C','Trainer B','128.00');
insert into `course_trainer_combination` (`id`, `course`, `trainer`, `distance`) values('9','Course C','Trainer C','121.00');
我的桌子就像
預期結果:
2 | Course A | Trainer B | 105
6 | Course B | Trainer C | 109
7 | Course C | Trainer A | 124
您可以使用相關子查詢
select ct.*
from course_trainer_combination ct
where ct.distance = (select min(ct1.distance)
from course_trainer_combination ct1
where ct1.course = ct.course
);
如果您使用的是較新版本,則可以使用分析功能:
select ct.*
from (select ct.*,
rank() over (partition by ct.course order by ct.distance) as seq
from course_trainer_combination ct
) ct
where ct.seq = 1;
另一種方法可能如下。
select id,
m.course,
trainer,
m.distance
from course_trainer_combination m
inner join (select course,
Min(distance) distance
from course_trainer_combination
group by course)t
on t.course = m.course
and t.distance = m.distance
注意 :如果兩個訓練師的1個球程的距離相同,則會顯示兩個記錄。
解決這個問題的一種方法是:
使用mysql用戶變量跟蹤已選擇的培訓師,並使用FIND_IN_SET()檢查培訓師已分配到課程的天氣:
SET @selectedTrainers :='';
SELECT *, @selectedTrainers := CONCAT(@selectedTrainers, ',', a.trainer) AS selectedTrainers
FROM `course_trainer_combination` a
where NOT EXISTS (
SELECT 1
FROM `course_trainer_combination` b
WHERE b.course = a.course
AND a.distance > b.distance
AND FIND_IN_SET(b.trainer, @selectedTrainers) = 0
)
AND FIND_IN_SET(a.trainer, @selectedTrainers) = 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.