簡體   English   中英

查找最近距離訓練員的查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM