В агрегатах (-> GROUP BY
) вы можете выбирать / использовать поля только в сочетании с функциями агрегации (например, SUM
, MAX
, MIN
) и полями, перечисленными в пункте GROUP BY
. .
Простой образец:
A | B
-----+-----
1 | 2
1 | 3
если вы напишите SELECT A,B FROM table GROUP BY A
, это даст:
A | B
-----+-----
1 |{2,3}
но это невозможно (B
имеет 2 значения в одной строке!?!). Вы должны что-то сделать со значениями B
, которые тоже группируют их. Итак, две возможности:
1 : добавить B
в GROUP BY
-классу
SELECT A,B FROM table GROUP BY A,B
выходы
A | B
-----+-----
1 | 2
1 | 3
2 : использовать функцию агрегирования для B
SELECT A,MAX(B) FROM TABLE GROUP BY A,B
дает вам
A | B
-----+-----
1 | 3
Те же аргументы применимы к предложению ORDER BY
.
В большинстве случаев, когда вы хотите написать утверждение, подобное первому, с которым я появился, вариант 1 - это решение, поскольку вы можете знать, что A
и B
принадлежат друг другу (общий пример: UserId
и UserName
) но СУБД этого не знает!