una - obtener registro anterior mysql
¿Por qué esta consulta devuelve una fila con nulos (2)
Esta respuesta real a esta pregunta es bastante complicada de explicar, para mí de todos modos :) Puntos principales: SQL no admite operadores agregados como se encuentra en el modelo relacional, más bien simplemente admite un caso especial de resumen. Además, dado que SQL tiene una estructura de datos única, la tabla: las invocaciones de operador agregadas de SQL (en términos generales) deben aparecer como parte de alguna expresión de tabla, por lo que su segunda tabla devuelve una única fila "ficticia".
Para una explicación más completa / mejor, vea Teoría SQL y relacional: Cómo acertar el código SQL - CJ Date (2009) , sección 7.5. Operadores agregados
comparar
SELECT distinct u_id,timestamp as time
FROM my_table;
y
SELECT distinct u_id,max(timestamp) as time
FROM my_table;
Cuando mi tabla no tiene filas en absoluto (o si agrego una cláusula Where que no coincide con ninguna fila):
El primero devuelve un conjunto de resultados vacío (que es lo que espero) mientras que el último devuelve una sola fila que tiene nulo como valor para ambos campos.
¿Puede alguien explicarme por qué el segundo actúa como lo hace?
La documentación de MySQL dice
MAX () devuelve NULL si no hubo filas coincidentes.
Y si no tiene datos, simplemente devuelve ambos valores como NULL.
Si desea que la segunda consulta también devuelva el conjunto de resultados vacío, debe filtrar los valores NULL, por ejemplo, con la cláusula HAVING que puede usar con las funciones agregadas:
SELECT DISTINCT u_id, MAX(timestamp) as time FROM my_table GROUP BY u_id HAVING time IS NOT NULL;