Запрос на поиск ближайших тренеров - PullRequest
0 голосов
/ 21 февраля 2019

Имя таблицы: 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');

Моя таблица похожа на

enter image description here

Ожидаемый результат:

2 | Course A | Trainer B | 105
6 | Course B | Trainer C | 109
7 | Course C | Trainer A | 124

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

Другой подход может быть похож на следующий.

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 курса.

0 голосов
/ 26 февраля 2019

Один из способов решения этой проблемы:

  • отслеживание инструкторов , назначенных для каждого курса, и
  • выбор строки со следующими условиями:
    • тренер еще не был назначен на курс
    • нет другого строка того же курса , с тренером, еще не выбранным, существует

Используйте пользовательскую переменную 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
0 голосов
/ 21 февраля 2019

Вы можете использовать коррелированный подзапрос

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...