Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

क्वेरी रिटर्न कोई परिणाम नहीं केवल जब ORDER BY जोड़ा गया

यह 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 पर देखें ।

आपके मामले में, आप इसे ठीक करने के लिए कई चीज़ें कर सकते हैं:

  1. जॉइन के रूप में फिर से लिखकर संबंधित सबक्वेरी से बचें:

    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
    
  2. यदि आप सहसंबद्ध सबक्वेरी रखना चाहते हैं (जो आम तौर पर खराब प्रदर्शन दे सकता है लेकिन अक्सर समझने में आसान होता है), 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
    
  3. यदि आप क्वेरी को बदलने में असमर्थ हैं, तो आपको 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)
    
  4. वैकल्पिक रूप से कोई भी people_stages.person_id को हटा सकता है चयन सूची से, या फ़ाइल सॉर्ट से बचने के लिए डेटा मॉडल/इंडेक्सिंग/क्वेरी रणनीति को समायोजित करें (इस मामले में व्यावहारिक नहीं हो सकता है, लेकिन मैं यहां पूर्णता के लिए उनका उल्लेख करता हूं)।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySql - विभिन्न सर्वरों में तालिकाओं का केस संवेदी मुद्दा

  2. MySQL में चालू माह का रिकॉर्ड कैसे प्राप्त करें

  3. DOMXPath क्वेरी पद्धति का उपयोग करके किसी वेबसाइट को स्क्रैप करते समय मैं लापता xPaths के लिए और अपने डेटा को एक समान कैसे रखूं?

  4. वर्णसेट एन्कोडिंग समस्या

  5. मुझे इन 2 डेटाबेस सेटअपों में से कौन सा चुनना चाहिए?