У меня есть users
locations
и таблица соединений visits
. Каждый пользователь может посетить несколько мест, и я хочу просмотреть пользователей, упорядоченных по названию места их последнего посещения.
CREATE TABLE users
("id" int, "name" varchar(128))
;
CREATE TABLE locations
("id" int, "name" varchar(128))
;
CREATE TABLE visits
("id" int, "user_id" int, "location_id" int, "date" timestamp)
;
INSERT INTO users
("id", "name")
VALUES
(1, 'Alpha'),
(2, 'Bravo'),
(3, 'Charlie');
INSERT INTO locations
("id", "name")
VALUES
(4, 'Delta'),
(5, 'Echo'),
(6, 'Foxtrott');
INSERT INTO visits
("id", "user_id", "location_id", "date")
VALUES
(1, 1, 4, '2000-02-03 00:00:00'),
(2, 1, 5, '2000-02-02 00:00:00'),
(3, 1, 6, '2000-02-01 00:00:00'),
(4, 2, 6, '2000-01-01 00:00:00'),
(5, 2, 5, '2000-01-01 00:00:00')
;
Я пытался
SELECT users.id, users.name, max(locations.name) as location_name, max(visits.date) as date
FROM users
LEFT JOIN visits ON users.id = visits.user_id
LEFT JOIN locations ON visits.location_id = locations.id
GROUP BY users.id, users.name
ORDER BY location_name
, но max (location.name) не зависит от max (посещения.даты)
еще одна попытка
SELECT users.id, users.name, t.date, locations.name as location_name
FROM users
LEFT JOIN (
SELECT MAX(date) as date, user_id
FROM visits
GROUP BY user_id
) AS t ON users.id = t.user_id
LEFT JOIN visits on visits.date = t.date
LEFT JOIN locations on locations.id = visits.location_id
ORDER BY location_name
но возникают проблемы, когда у одного пользователя два посещения в одну и ту же дату (мне все равно, какое место выбирают, но оно должно быть только одно)
результат должен выглядеть примерно так, хотя дата не требуется.
id name date location_name
1 Alpha 2000-02-03T00:00:00Z Delta
2 Bravo 2000-01-01T00:00:00Z Echo
3 Charlie (null) (null)
решение предпочтительно в ActiveRecord, но обычный sql тоже подойдет
http://sqlfiddle.com/#!17/ba2a6/1