Получить самую последнюю запись из отношения один ко многим - PullRequest
0 голосов
/ 10 декабря 2018

Как я уже сказал в заголовке, имея следующую схему:

CREATE TABLE IF NOT EXISTS `services` (
  `id` int(6) unsigned NOT NULL,
  `description` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

INSERT INTO `services` (`id`, `description`) VALUES
  ('1', 'Water flood from kitchen'),
  ('2', 'Light switch burnt');


CREATE TABLE IF NOT EXISTS `visits` (
  `id` int(6) unsigned NOT NULL,
  `date` DATETIME NOT NULL,
  `description` varchar(200) NOT NULL,
  `worker` varchar(200) NOT NULL,
  `services_id` int(6) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

INSERT INTO `visits` (`id`, `date`, `description`, `worker`, `services_id`) VALUES
  ('1', '2018-12-10 16:00:00', 'Find and stop leak', 'Thomas', '1'),
  ('2', '2018-12-11 09:00:00', 'Change broken pipe', 'Bob', '1'),
  ('3', '2018-12-10 19:00:00', 'Change light switch', 'Alfred', '2'),
  ('4', '2018-12-11 10:00:00', 'Paint wall blackened by shortcircuit', 'Ryan', '2');

Мне нужно получить самое последнее посещение по дате для каждой службы.

В этом примереЯ бы получил:

'1', '2018-12-10 16:00:00', 'Find and stop leak', 'Thomas', '1'
'3', '2018-12-10 19:00:00', 'Change light switch', 'Alfred', '2'

Как бы вы это сделали?Я изо всех сил пытаюсь найти решение.

Вот SQLFiddle:

http://sqlfiddle.com/#!9/3ca219

1 Ответ

0 голосов
/ 10 декабря 2018

Я бы предложил коррелированный подзапрос:

select v.*
from visits v
where v.date = (select max(v2.date)
                from visits v2
                where v2.services_id = v.services_id
               );

При индексе visits(services_id, date) это должно быть так же быстро или быстрее, чем другие подходы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...