Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL 5.7 e only_full_group_by

  1. Sì. Le colonne non aggregate sono qualsiasi colonna che non utilizza una funzione di aggregazione come MAX , COUNT , SUM , GROUP_CONCAT , ecc.

  2. Colonna a dipende funzionalmente dalla colonna b se il valore di b implica un valore particolare di a . Questo generalmente significa che b è una chiave univoca per la tabella e a è un'altra colonna in quella tabella.

  3. Determinato in modo univoco da è lo stesso della dipendenza funzionale.

  4. L'alternativa sarebbe elencare tutte le colonne non aggregate in GROUP BY elenco:GROUP BY a.Z, a.Y, a.X .

Il motivo di tutto ciò è che quando selezioni colonne che non sono nel GROUP BY list, proverranno da righe arbitrarie nelle righe raggruppate. Questo porta a molti errori comuni. Ad esempio, un errore comune è scrivere:

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

e aspettati ip_address per contenere l'indirizzo del login più recente per ciascun utente. Ma in realtà conterrà qualsiasi degli indirizzi da cui hanno effettuato l'accesso, non quello della riga con MAX(timestamp) . Vedi SQL Seleziona solo le righe con valore massimo su una colonna per il modo corretto di farlo.

L'eccezione di dipendenza funzionale è in genere utile con i join.

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

Da user_id è la chiave primaria degli users tabella, determina in modo univoco user_name , quindi non è necessario elencarlo esplicitamente in GROUP BY .