Сложный SQL-запрос на соединение - получить новейшую строку - PullRequest
1 голос
/ 24 декабря 2011

My MySQL db имеет таблицу (cfg) с 4 полями: id, name, data и 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 ]

2 голосов
/ 24 декабря 2011

Используйте подзапрос с 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
0 голосов
/ 24 декабря 2011
select name, data
from cfg
where id in (select max(id) from cfg where location = "dc" group by name)

Это просто непроверенный от руки, но я думаю, вы поняли идею.Это предполагает, что идентификатор столбца уникален.

0 голосов
/ 24 декабря 2011

Я думаю

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 

и использовать индекс на (местоположение, имя, идентификатор) и один на просто (идентификатор)

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