Вы можете использовать эти запросы «безопасно», то есть без получения неоднозначных результатов, если дополнительные столбцы функционально зависят от столбцов, которые вы группируете по:
SELECT c.parent_id, COUNT(*), p.any_column
FROM child_table c
JOIN parent_table p USING (parent_id)
GROUP BY c.parent_id;
Приведенный выше пример будет работать в SQLite и давать однозначный результат, поскольку нет способа, чтобы p.any_column
мог иметь несколько значений на группу. Однако этот запрос строго нарушает стандарт SQL, и большинство брендов СУБД вызовут ошибку.
Слишком легко написать запрос, который дает неоднозначные результаты. Когда вы называете столбец с несколькими значениями на группу, вы не можете контролировать, какое значение возвращается в вашем наборе результатов.
На практике MySQL возвращает значение из строки first относительно физического хранилища, а SQLite возвращает значение из строки last . Но это полностью зависит от реализации и не надежно. Если следующая версия любого программного обеспечения изменит свои внутренние компоненты, вы можете получить другие результаты запроса после обновления. Поэтому лучше не полагаться на это поведение.
Что касается вашего примера, где content
должен «интуитивно» иметь значение из строки, где sequence
- MAX. Но действительно ли это интуитивно понятно? Рассмотрим эти другие случаи:
SELECT MAX(sequence), MIN(sequence), type, content
FROM message
GROUP BY type
Так, какая строка теперь предоставляет значение для content
? Строка, где sequence
- МАКС., Или строка, где sequence
- МИН.?
Что делать, если вы используете неуникальный столбец (например, date
), и есть несколько строк с одинаковым значением MAX для date
, но разными значениями для content
?
SELECT MAX(date), type, content
FROM message
GROUP BY type
А как насчет других агрегатных функций, таких как AVG()
или SUM()
? Возможно, что значение агрегата не соответствует отдельной строке таблицы. Итак, какая строка должна содержать значение для content
?
SELECT AVG(sequence), type, content
FROM message
GROUP BY type