Esto parece ser un error en MySQL, sobre el cual he archivado un informe . Lo he reducido al siguiente caso de prueba, que uno esperaría devolver un solo registro (pero no lo hace):
CREATE TABLE t (x INT NULL); -- table with nullable column
INSERT INTO t VALUES (0); -- but non null data
SELECT a.x -- select our nullable column
FROM t a, (SELECT NULL) b -- joining it with anything at all
WHERE EXISTS ( -- but filter on a subquery
SELECT *
FROM (SELECT NULL) c -- doesn't really matter what
HAVING a.x IS NOT NULL -- provided there is some correlated condition
-- on our nullable column in the HAVING clause
)
ORDER BY RAND() -- then perform a filesort on the outer query
Véalo en sqlfiddle .
En su caso, puede hacer varias cosas para solucionarlo:
-
Evite la subconsulta correlacionada reescribiéndola como una unión:
SELECT * FROM people AS p LEFT JOIN (people_stages AS s NATURAL JOIN ( SELECT person_id, MAX(created) created FROM people_stages GROUP BY person_id ) t) ON s.person_id = p.id ORDER BY p.last_name
-
Si desea mantener la subconsulta correlacionada (que generalmente puede generar un rendimiento deficiente pero a menudo es más fácil de entender), use
WHERE
en lugar deHAVING
:SELECT * FROM people AS p LEFT JOIN people_stages AS s ON s.person_id = p.id WHERE s.created = ( SELECT MAX(created) FROM people_stages WHERE person_id = s.person_id ) ORDER BY p.last_name
-
Si no puede cambiar la consulta, debería encontrar que hacer
people_stages.person_id
la columna no anulable solucionará el problema:ALTER TABLE people_stages MODIFY person_id BIGINT UNSIGNED NOT NULL
Parece que tener un índice en esa columna (que sería necesario para efectuar una restricción de clave externa) también puede ayudar:
ALTER TABLE people_stages ADD FOREIGN KEY (person_id) REFERENCES people (id)
-
Alternativamente, se podría eliminar
people_stages.person_id
de la lista de selección, o ajuste el modelo de datos/indexación/estrategia de consulta para evitar una ordenación de archivos (puede que no sea práctico en este caso, pero los menciono aquí para completar).