2015-06-06 7 views
0

, если я использую заказ на и группу, как это нижеиспользование OrderBy и группа по совместно

select * from (SELECT * FROM `entry` ORDER BY jc_epoc DESC)as b GROUP BY type 

делает этот запрос всегда дать мне самый большой TIMESTAMP в каждом типе? если нет, то какой правильный запрос?

+1

Можете ли вы добавить пример данных и схему? – Beginner

ответ

1

Нет, он не должен, но, по-видимому, он работает чаще, чем нет. Реальная проблема с вашим запросом заключается в том, что теоретически это нарушает 1NF. Предполагая, что mysql всегда выбирает первую строку в таком случае, вы создаете запрос, но на самом деле он может отличаться и не является надежным, как это предлагается в документации. При выборе неагрегированных столбцов, которые не всегда одинаковы, MySql может свободно выбирать любое значение, поэтому итоговое значение, которое оно фактически показывает, является неопределенным.

Вопрос требует большей ясности относительно того, сколько строк для каждого типа требуется, например, для нескольких экземпляров максимального значения для каждого типа. Но я получаю смутное представление о том, что вы пытаетесь - «Вы хотите, чтобы получить значение макс для каждого типа и вместе с ним все другие значения столбцов для этой строки»

Чтобы сделать запрос, детерминировано Я хотел бы сделать - Если несколько строк для каждого типа отлично

SELECT * 
FROM entry e1 
WHERE (e1.type, e1.jc_epoc) IN 
( SELECT e.type, MAX(e.jc_epoc) 
    FROM entry e 
    GROUP BY e.type 
) 

Если несколько строк для каждого типа не в порядке, вы должны использовать ключевое значение, чтобы получить единственное значение

SELECT e2.* 
FROM entry e2 
LEFT OUTER JOIN entry e3 
ON e3.jc_epoc >= e2.jc_epoc 
AND e3.type = e2.type 
AND e3.id > e2.id 
WHERE e3.id IS NULL 

Примечание: - Запросы выше могут иметь больше возможностей оптимизации. Для получения более четких/лаконичных требований запросы могут быть оптимизированы версии Экс- только для MAX (jc_epoc) для каждого типа требуется, и никакие другие Колонку значения

SELECT e.type, MAX(e.jc_epoc) 
FROM entry e 
GROUP BY e.type 

Смело SQLFiddle it.

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