2015-03-28 2 views
0

Я имею эту таблицу: - http://sqlfiddle.com/#!9/b3223/1MySQL группы максимальное значение строки

 
id entity_id value date 
1 1   98  March, 28 2015 19:58:43 
2 1   321  March, 28 2015 19:59:54 
3 1   123  March, 28 2015 19:59:54 
4 2   34  March, 28 2015 20:00:43 
5 2   76  March, 28 2015 20:00:44 

И я хочу, чтобы перечислить новейший ряд (по date значения) для каждого entity_id.

Первое решение, а не тот также: - http://sqlfiddle.com/#!9/b3223/2

 
SELECT id, entity_id, value, MAX( `date`) 
FROM `gmd` 
GROUP BY entity_id 

Один из рабочих растворов, кажется: - http://sqlfiddle.com/#!9/b3223/3

SELECT id, entity_id, value, `date` 
FROM gmd AS main 
WHERE DATE = ( 
    SELECT MAX( `date`) 
    FROM gmd 
    WHERE entity_id = main.entity_id 
) 
GROUP BY entity_id

мне интересно, если это надежное решение, и если есть другие более элегантные способы сделать это.

Спасибо!

+0

И на две одинаковые даты? Отображать обе записи для каждого объекта? –

+0

Проверьте свой второй результат запроса с некоторыми изменениями данных. Http://sqlfiddle.com/#!9/ce5ab/1 – Beginner

+0

@Beginner, я вижу вашу точку зрения, но в этом случае результат все равно нормально, потому что обе даты равны. Хотя может быть второе значение для сравнения с и может быть самым высоким ID. –

ответ

1

Вы можете попробовать это, если вы всегда хотите, чтобы получить значение, имеющее высокий id, если они имеют такую ​​же date:

SELECT id, entity_id, value, 
    (SELECT MAX(`date`) FROM gmd y WHERE y.id = x.id) AS `date` 
FROM `gmd` x 
GROUP BY entity_id DESC 
ORDER BY id; 

Вот sqlfiddle.

+0

Действительно, это, по-видимому, лучшее решение, хотя заказ «по последнему идентификатору» должен быть сделан каким-то образом внутри, не указывая в запросе. И это выглядит намного лучше, чем мое рабочее решение, спасибо! PS: Можете ли вы оставить мне подсказку, почему он на самом деле выбирает последний идентификатор? –

+0

'GROUP BY entity_id DESC' попытается удалить' DESC' – Beginner

1

Это еще один способ, но, как вы можете видеть, есть связь:

select id, entity_id, value, `date` 
    from gmd x 
    join (select entity_id, max(date) as `date` from gmd group by entity_id) y 
using (entity_id, `date`) 

Fiddle: http://sqlfiddle.com/#!9/b3223/11/0

В вашем 'рабочем' запрос, произвольное (случайное) значение для value выбирается поле, так как оно не находится в вашем предложении group by. В большинстве других баз данных, кроме MySQL, это приведет к синтаксической ошибке.

Если вы не хотите, оба значения для value привезенные в случае равенства между 2 значениями value для того же entity_id и date, как вы хотите, чтобы решить, какое значение value вернуть?

Редактировать, основываясь на комментарии - Если вы хотите, чтобы вставленная «последняя» строка должна была быть каким-то способом установления порядка за пределами date. Если предположить, что что id поле подымается со временем, вы можете присоединиться к максимальной id для каждого entity_id таким образом:

select id, entity_id, value, `date` 
    from gmd x 
    join (select entity_id, max(id) as id from gmd group by entity_id) y 
using (entity_id, id) 

Fiddle: http://sqlfiddle.com/#!9/b3223/35/0

+0

Предположим, если есть случай, когда две даты будут равны для одного и того же идентификатора объекта, я могу выбрать тот, который был вставлен последним. Но ваш запрос кажется немного более «осведомленным» об этом, и он возвращает оба значения в этом случае, что может быть полезно. Я полагаю, что в «рабочем» запросе вы ссылаетесь на первый нерабочий запрос. Верный ? Спасибо! –

+0

Вы только разместили два запроса, вы сказали, что первое было неправильным, а второе работало. Я имел в виду второй. Однако оба они имеют предложение group by, которое исключает столбцы в списке выбора, несмотря на то, что агрегированные функции находятся в списке выбора, поэтому они оба имеют проблему выбора произвольных строк и оба возвращают синтаксическую ошибку в любой базе данных, отличной от MySQL. Я добавил второй запрос, который должен захватить «последнюю вставленную строку», предполагая, что ваш столбец «id» является полем автоматического приращения. –

Смежные вопросы