Сложный SQL-запрос на соединение - получить новейшую строку
Моя база данных MySQL имеет таблицу (cfg) с 4 полями: id, name, data и location. Эта одна таблица предназначена для обслуживания нескольких поддоменов (location). Мне нужно получить список самых новых строк для каждого имени для данного субдомена (местоположение).
Пример данных
id name data location
---------------------------
1 color red dc
2 color blue dc
3 size large sj
4 color green sj
5 size small dc
Следующий запрос работает нормально, но он кажется слишком сложным и медленным. У кого-нибудь есть предложение?
SELECT c1.name, c1.data
FROM (SELECT * FROM cfg WHERE location = "dc") as c1
LEFT JOIN (SELECT * FROM cfg WHERE location = "dc") as c2 ON ( c1.name = c2.name
AND c1.id < c2.id )
WHERE c2.id IS NULL
Вернется
name data
--------------
color blue
size small
3 ответа
Решение
Используйте подзапрос с GROUP BY
это вычисляет макс. id
в name
:
SELECT cfg.*
FROM cfg
JOIN (
SELECT max(id) AS max_id
FROM cfg c0
WHERE location = 'dc'
GROUP BY name
) n ON n.max_id = cfg.id
Я думаю
select c.name, c.data
from cfg c
join (
select max(id) id
from cfg
group by name
where location = 'dc'
) nameMaximums on nameMaximums.id = c.id
и использовать индекс на (местоположение, имя, идентификатор) и один на просто (идентификатор)
select name, data
from cfg
where id in (select max(id) from cfg where location = "dc" group by name)
Это просто непроверенный от руки, но я думаю, вы поняли идею. Это предполагает, что идентификатор столбца уникален.