Pero ¿Por qué recibo Uzbekistán para el total ??
Porque no SELECCIONA el elemento que está AGRANDANDO. Si dijo:
GROUP BY c.printable_name
Obtendrá el NULL esperado. Sin embargo, está agrupando por una columna diferente, por lo que MySQL no sabe que imprimible_name está participando en un grupo de resumen, y selecciona cualquier valor anterior de esa columna, en la unión de todos los registros. (Por lo tanto, es posible que vea otros países además de Uzbekistán.)
Esto es parte de un problema más amplio con MySQL siendo permisivo en lo que puede SELECCIONAR en una consulta GROUP BY. Por ejemplo, puede decir:
SELECT gender FROM registrations GROUP BY country;
y MySQL estará feliz de tomar uno de los valores de género para un registro de cada país, a pesar de que no existe una relación causal directa (también conocido como “dependencia funcional”) entre el país y el género . Otros DBMS se niegan el comando anterior con el argumento de que no se garantiza que sea un género por país (*)
Ahora, esto:.
SELECT c.printable_name AS 'Country', count(*) AS '#'
FROM registrations r
INNER JOIN country c ON r.country = c.country_id
GROUP BY country
está bien, porque hay una dependencia funcional entre r.country y c.printable_name (suponiendo que haya descrito correctamente su country_id como PRIMARY KEY).
Sin embargo, la extensión WITH ROLLUP de MySQL es un poco un truco en la forma en que funciona. En la etapa de la fila de resumen al final, se ejecuta en todo el conjunto de resultados de preagrupación para tomar sus valores, y luego establece la columna de agrupación por NULO. Tampoco anula otras columnas que tienen una dependencia funcional en esa columna. Probablemente debería, pero MySQL actualmente no entiende realmente todo sobre las dependencias funcionales.
Si selecciona c.printable_name, le mostrará el valor del nombre del país elegido al azar, y si selecciona c.country_id le mostrará la ID de país elegida al azar, aunque c.country_id es el criterio de unión, por lo que debe ser el mismo que r.country, que es NULL.
Lo que puede hacer para solucionar el problema es:
- grupo por printable_name lugar; debe estar bien si printable_names son únicos, o
- seleccione “r.country”, así como printable_name, y comprobar que por ser NULL, o
- olvidemos CON ROLLUP y hacer una consulta independiente de la suma final. Esto será un poco más lento, pero también será compatible con ANSI SQL-92 para que su aplicación pueda funcionar en otras bases de datos.
(*: MySQL tiene una opción sql_mode ONLY_FULL_GROUP_BY que se supone que para hacer frente a este problema, pero va demasiado lejos y sólo le permite seleccionar las columnas de cada grupo por, no columnas que tienen una dependencia funcional en el GRUPO POR. Por lo tanto, hará consultas válidas fallan, así, por lo que es generalmente inútil.)
¿Cuán seguro está de que el problema no es cómo se muestran los resultados? –
ocurre tanto en mi código, como en phpmyadmin. Desearía intentar probarlo con el navegador de búsqueda mysql habitual o algo así, pero no tengo acceso. – Svish
Estaba jugando con Rollup también. Creo que el problema aquí es que se está uniendo al ID del país con el nombre del país, por lo que no todos los valores NULL se unen, y por alguna razón, mantenga el último valor del nombre en lugar de no tener un nombre. – sphism