Mysql - «Выбрать максимум» из нескольких соединенных таблиц не возвращает правильные значения - PullRequest
2 голосов
/ 19 сентября 2019

У меня есть две таблицы: одна представляет собой список адресов, а другая - даты посещений и EmployeeIDNumbers, чтобы идентифицировать присутствовавшего инженера.Инженер, возможно, посетил адрес несколько раз.Я пытаюсь выбрать имя адреса, самую последнюю дату посещения и соответствующий код Engineer

select s.sitename, max(sd.scheduleddate), sd.EngineerID
from sites as s 
left join scheduled_dates as sd on sd.idsites = s.idsites
group by s.idsites

. Этот код правильно извлекает каждый адрес и самую последнюю «Запланированную дату», но не получает правильный соответствующий идентификатор инженера.,Как я могу получить engineerID из той же строки, что и max (scheduledate)?Думаю, это как-то связано с обсуждением «наибольшего числа групп», но я не понимаю, как реализовать этот код с помощью запроса, который уже имеет соединение

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

В MySQL 8+ вы можете использовать оконные функции:

select s.sitename, sd.scheduleddate, sd.EngineerID
from sites s left join
     (select sd.*,
             row_number() over (partition by sd.idsites orer by sd.scheduleddate desc) as seqnum
      from scheduled_dates sd
     ) sd
     on sd.idsites = s.idsites and sd.seqnum = 1;

Обратите внимание, что при этом также сохраняются все сайты (которые, по-видимому, являются вашими намерениями), даже те, которые не были посещены.

0 голосов
/ 19 сентября 2019

Вы можете использовать условие NOT EXISTS с коррелированным подзапросом:

select s.sitename, sd.EngineerID, sd.scheduleddate
from sites as s 
inner join scheduled_dates as sd on sd.idsites = s.idsites
where not exists (
    select 1
    from scheduled_dates sd1
    where sd1.idsites = s.idsites
    and sd1.scheduleddate > sd.scheduleddate
)

Условие обеспечивает отсутствие других записей в scheduled_dates для текущего сайта с датой, превышающей дату ввыбранная запись.

Примечания: я превратил вас LEFT JOIN в INNER JOIN, поскольку я считаю, что он лучше подходит для ваших сценариев использования, не стесняйтесь отменить это при необходимости.

...