Вы не можете (не должен), помещенный не агрегироваться в SELECT
строка a GROUP BY
запрос.
Я однако хотел бы доступ тот из неагрегатов, связанных с максимум. На простом английском языке я хочу таблицу с самым старым идентификатором каждого вида.
CREATE TABLE stuff (
id int,
kind int,
age int
);
Этот запрос дает мне информацию, которая я после:
SELECT kind, MAX(age)
FROM stuff
GROUP BY kind;
Но это не находится в самой полезной форме. Я действительно хочу id
связанный с каждой строкой, таким образом, я могу использовать его в более поздних запросах.
Я ищу что-то вроде этого:
SELECT id, kind, MAX(age)
FROM stuff
GROUP BY kind;
Это производит это:
SELECT stuff.*
FROM
stuff,
( SELECT kind, MAX(age)
FROM stuff
GROUP BY kind) maxes
WHERE
stuff.kind = maxes.kind AND
stuff.age = maxes.age
Действительно кажется, что должен быть способ получить эту информацию, не будучи должен присоединиться. Мне просто нужен механизм SQL для запоминания других столбцов, когда он вычисляет максимум.
Невозможно получить идентификатор строки, найденной MAX, потому что может быть не только один идентификатор с максимальным возрастом.
У вас должно быть соединение, потому что агрегатная функция max извлекает много строк и выбирает макс. Итак, вам нужно объединение, чтобы выбрать то, которое было найдено агрегатной функцией.
Другими словами, как вы ожидаете, что запрос будет вести себя, если вы замените max на сумму?
Однако внутреннее соединение может быть более эффективным, чем ваш подзапрос.
Вы не можете (не должны) помещать неагрегатные данные в строку SELECT запроса GROUP BY.
Вы можете и должны определить, по чему вы группируете, чтобы агрегатная функция возвращала правильный результат.
MySQL (и SQLite) в своей бесконечной мудрости решили, что они пойдут против спецификации и позволят запросам принимать предложения GROUP BY, в которых отсутствуют столбцы, указанные в SELECT - это фактически делает эти запросы непереносимыми.
Похоже, что должен быть способ получить эту информацию без необходимости присоединяться.
Без доступа к функциям аналитики / ранжирования / управления окнами, которые MySQL не поддерживает, самостоятельное присоединение к производной таблице / встроенному представлению является наиболее переносимым средством получения желаемого результата.
Я думаю, что действительно заманчиво попросить систему решить проблему за один проход, вместо того, чтобы делать работу дважды (найти максимум и найти соответствующий идентификатор). Вы можете использовать CONCAT (как предложено в статье, на которую ссылается Naktibalda), но не уверен, что это будет более эффективно
SELECT MAX( CONCAT( LPAD(age, 10, '0'), '-', id)
FROM STUFF1
GROUP BY kind;
Должно сработать, вам придется разделить ответ, чтобы получить возраст и id. (Хотя это очень некрасиво)