sql >> Base de Datos >  >> RDS >> Mysql

MySQL 5.7 y only_full_group_by

  1. Sí. Las columnas no agregadas son cualquier columna que no use una función de agregación como MAX , COUNT , SUM , GROUP_CONCAT , etc.

  2. Columna a depende funcionalmente de la columna b si el valor de b implica un valor particular de a . Esto generalmente significa que b es una clave única para la tabla, y a es alguna otra columna en esa tabla.

  3. Determinado únicamente por es lo mismo que la dependencia funcional.

  4. La alternativa sería listar todas las columnas no agregadas en el GROUP BY lista:GROUP BY a.Z, a.Y, a.X .

La razón de todo esto es que cuando selecciona columnas que no están en el GROUP BY list, provendrán de filas arbitrarias en las filas agrupadas. Esto conduce a muchos errores comunes. Por ejemplo, un error común es escribir:

SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id

y esperar ip_address para contener la dirección del inicio de sesión más reciente para cada usuario. Pero en realidad contendrá cualquier de las direcciones desde las que iniciaron sesión, no la de la fila con MAX(timestamp) . Consulte SQL Seleccionar solo filas con valor máximo en una columna para conocer la forma correcta de hacerlo.

La excepción de dependencia funcional suele ser útil con uniones.

SELECT u.user_id, u.user_name, MAX(l.timestamp)
FROM users AS u
JOIN user_logins AS l ON u.user_id = l.user_id
GROUP BY u.user_id

Desde user_id es la clave principal de los users tabla, determina de forma única user_name , por lo que no es necesario enumerarlo explícitamente en GROUP BY .