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

PHP MySQL कॉलम में सबसे छोटी लापता संख्या खोजें

अगर Order कॉलम को अनुक्रमित किया गया है, आप SQL के साथ पहला लापता नंबर प्राप्त कर सकते हैं, बिना LEFT JOIN को छोड़कर पूरी तालिका को पढ़े:

SELECT t1.`Order` + 1 AS firstMissingOrder
FROM tabla t1
LEFT JOIN tabla t2 ON t2.`Order` = t1.`Order` + 1
WHERE t2.`Order` IS NULL
  AND t1.`Order` <> (SELECT MAX(`Order`) FROM tabla)
ORDER BY t1.`Order`
LIMIT 1

या (शायद अधिक सहज ज्ञान युक्त)

SELECT t1.`Order` + 1 AS firstMissingOrder
FROM tabla t1
WHERE NOT EXISTS (
    SELECT 1
    FROM tabla t2
    WHERE t2.`Order` = t1.`Order` + 1
) 
    AND t1.`Order` <> (SELECT MAX(`Order`) FROM tabla)
ORDER BY t1.`Order`
LIMIT 1

दूसरी क्वेरी को MySQL द्वारा पहले वाले में बदल दिया जाएगा। इसलिए वे व्यावहारिक रूप से समान हैं।

अपडेट करें

स्ट्राबेरी ने एक अच्छी बात का उल्लेख किया है:पहला लापता नंबर 1 . हो सकता है , जो मेरी क्वेरी में शामिल नहीं है। लेकिन मुझे कोई समाधान नहीं मिला, जो दोनों ही तरह का हो - सुरुचिपूर्ण और तेज़।

हम विपरीत दिशा में जा सकते हैं और अंतराल के बाद पहले नंबर की खोज कर सकते हैं। लेकिन उस अंतराल से पहले अंतिम मौजूदा संख्या खोजने के लिए फिर से तालिका में शामिल होने की आवश्यकता होगी।

SELECT IFNULL(MAX(t3.`Order`) + 1, 1) AS firstMissingOrder
FROM tabla t1
LEFT JOIN tabla t2 ON t2.`Order` = t1.`Order` - 1
LEFT JOIN tabla t3 ON t3.`Order` < t1.`Order`
WHERE t1.`Order` <> 1
  AND t2.`Order` IS NULL
GROUP BY t1.`Order`
ORDER BY t1.`Order`
LIMIT 1

MySQL (मेरे मामले में MariaDB 10.0.19) उस क्वेरी को ठीक से अनुकूलित करने में सक्षम नहीं है। अनुक्रमित (पीके) 1 एम पंक्ति तालिका पर लगभग एक सेकंड लगता है, भले ही पहली लापता संख्या 9 है। मैं उम्मीद करता हूं कि सर्वर t1.Order=10 के बाद खोजना बंद कर देगा। , लेकिन ऐसा नहीं करना आसान है।

एक और तरीका, जो तेज़ है लेकिन बदसूरत दिखता है (IMHO), मूल क्वेरी का उपयोग उप-चयन में केवल तभी करना है जब Order=1 मौजूद। अन्यथा 1 return लौटाएं ।

SELECT CASE
    WHEN NOT EXISTS (SELECT 1 FROM tabla WHERE `Order` = 1) THEN 1
    ELSE (
        SELECT t1.`Order` + 1 AS firstMissingOrder
        FROM tabla t1   
        LEFT JOIN tabla t2 ON t2.`Order` = t1.`Order` + 1
        WHERE t2.`Order` IS NULL
          AND t1.`Order` <> (SELECT MAX(`Order`) FROM tabla)
        ORDER BY t1.`Order`
        LIMIT 1
    )
END AS firstMissingOrder

या UNION का उपयोग कर रहे हैं

SELECT 1 AS firstMissingOrder FROM (SELECT 1) dummy WHERE NOT EXISTS (SELECT 1 FROM tabla WHERE `Order` = 1)
UNION ALL
SELECT firstMissingOrder FROM (
    SELECT t1.`Order` + 1 AS firstMissingOrder
    FROM tabla t1
    LEFT JOIN tabla t2 ON t2.`Order` = t1.`Order` + 1
    WHERE t2.`Order` IS NULL
      AND t1.`Order` <> (SELECT MAX(`Order`) FROM tabla)
    ORDER BY t1.`Order`
    LIMIT 1
) sub
LIMIT 1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. टेक्स्ट छोड़ते समय टैग PHP XML MYSQL GCIDE के भीतर टैग कैसे निकालें?

  2. PHP पर MySQL संग्रहित प्रक्रिया को कॉल करना

  3. MySQL जहां अधिकतम तिथि और अधिकतम समय चुनें

  4. MySQL सर्वर से कनेक्ट करना इतना धीमा क्यों है?

  5. लैटिन -1 से utf-8 डेटाबेस