यह 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
को हटा सकता है चयन सूची से, या फ़ाइल सॉर्ट से बचने के लिए डेटा मॉडल/इंडेक्सिंग/क्वेरी रणनीति को समायोजित करें (इस मामले में व्यावहारिक नहीं हो सकता है, लेकिन मैं यहां पूर्णता के लिए उनका उल्लेख करता हूं)।