Изглежда, че това е грешка в MySQL, за която подал сигнал . Стесних го до следния тестов случай, който би очаквал да върне един запис (но не го прави):
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
Вижте го на sqlfiddle .
Във вашия случай можете да направите няколко неща, за да коригирате това:
-
Избягвайте корелираната подзаявка, като пренапишете като присъединяване:
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
-
Ако искате да запазите свързаната подзаявка (която обикновено може да доведе до слаба производителност, но често е по-лесна за разбиране), използвайте
WHERE
вместоHAVING
: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
-
Ако не можете да промените заявката, трябва да откриете, че правите
people_stages.person_id
колона без нула ще заобиколи проблема:ALTER TABLE people_stages MODIFY person_id BIGINT UNSIGNED NOT NULL
Изглежда, че наличието на индекс в тази колона (който би бил необходим за въздействие на ограничение на външния ключ) също може да помогне:
ALTER TABLE people_stages ADD FOREIGN KEY (person_id) REFERENCES people (id)
-
Като алтернатива може да се премахне
people_stages.person_id
от списъка за избор или коригирайте стратегията за модел на данни/индексиране/заявка, за да избегнете сортиране на файлове (може да не е практично в този случай, но ги споменавам тук за пълнота).