12.11.3. GROUP BY
with Hidden Fields
MySQL extends the use of GROUP BY
so that you
can use columns or calculations in the SELECT
list that do not appear in the GROUP BY
clause. This stands for “any possible value for this
group.” You can use this to get better performance by
avoiding sorting and grouping on unnecessary items. For example,
you do not need to group on customer.name
in
the following query:
SELECT order.custid, customer.name, MAX(payments)
FROM order,customer
WHERE order.custid = customer.custid
GROUP BY order.custid;
In standard SQL, you would have to add
customer.name
to the GROUP
BY
clause. In MySQL, the name is redundant if you do
not run with the ONLY_FULL_GROUP_BY
SQL mode
enabled.
Do not use this feature if the columns you
omit from the GROUP BY
part are not unique in
the group! You get unpredictable results.
In some cases, you can use MIN()
and
MAX()
to obtain a specific column value even
if it isn't unique. The following gives the value of
column
from the row containing the smallest
value in the sort
column:
SUBSTR(MIN(CONCAT(RPAD(sort,6,' '),column)),7)
See Section 3.6.4, “The Rows Holding the Group-wise Maximum of a Certain Field”.
Note that if you are trying to follow standard SQL, you can't
use expressions in GROUP BY
clauses. You can
work around this limitation by using an alias for the
expression:
SELECT id,FLOOR(value/100) AS val
FROM tbl_name
GROUP BY id, val;
MySQL does allow expressions in GROUP BY
clauses. For example:
SELECT id,FLOOR(value/100)
FROM tbl_name
GROUP BY id, FLOOR(value/100);