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

MySQL उप-चयन के अंदर सीमा खंड का समर्थन नहीं करता है, मैं यह कैसे कर सकता हूं?

चुनें ... सबक्वेरी में LIMIT समर्थित नहीं है, मुझे डर है, इसलिए यह सेल्फ-जॉइन मैजिक को तोड़ने का समय है:

SELECT article.*
FROM article
JOIN (
    SELECT a0.category_id AS id, MIN(a2.article_id) AS lim
    FROM article AS a0
    LEFT JOIN article AS a1 ON a1.category_id=a0.category_id AND a1.article_id>a0.article_id
    LEFT JOIN article AS a2 ON a2.category_id=a1.category_id AND a2.article_id>a1.article_id
    GROUP BY id
) AS cat ON cat.id=article.category_id
WHERE article.article_id<=cat.lim OR cat.lim IS NULL
ORDER BY article_id;

बीच में बिट आरोही आईडी क्रम में एक ही तालिका की तीन प्रतियों को जोड़ने का प्रयास करके प्रत्येक श्रेणी के लिए तीसरे-निम्नतम-आईडी आलेख की आईडी पर काम कर रहा है। यदि किसी श्रेणी के लिए तीन से कम लेख हैं, तो लेफ्ट जॉइन सुनिश्चित करेगा कि सीमा NULL है, इसलिए बाहरी WHERE को भी उस मामले को लेने की आवश्यकता है।

यदि आपकी "शीर्ष 3" आवश्यकता किसी बिंदु पर "शीर्ष n" में बदल सकती है, तो यह बोझिल होने लगती है। उस स्थिति में आप पहले अलग-अलग श्रेणियों की सूची को क्वेरी करने के विचार पर पुनर्विचार करना चाहेंगे और फिर प्रति-श्रेणी के प्रश्नों को जोड़ सकते हैं।

ईटीए:दो कॉलम पर ऑर्डर करना:ईक, नई आवश्यकताएं! :-)

यह निर्भर करता है कि आपका क्या मतलब है:यदि आप केवल अंतिम परिणामों का आदेश देने की कोशिश कर रहे हैं तो आप इसे अंत में धमाका कर सकते हैं कोई समस्या नहीं है। लेकिन अगर आपको इस आदेश का उपयोग करने की आवश्यकता है तो यह चुनने के लिए कि कौन से तीन लेखों को चुना जाना है, चीजें बहुत कठिन हैं।

हम '<' के साथ सेल्फ़-जॉइन का उपयोग कर रहे हैं ताकि 'आर्टर बाय article_id' के प्रभाव को पुन:उत्पन्न किया जा सके। दुर्भाग्य से, जबकि आप 'ऑर्डर बाय ए, बी' कर सकते हैं, आप नहीं . कर सकते हैं करो '(ए, बी)<(सी, डी)'... न ही आप 'मिन (ए, बी)' कर सकते हैं। साथ ही, आप वास्तव में तीन कॉलम, issticky, प्रकाशित और . द्वारा ऑर्डर कर रहे होंगे article_id, क्योंकि आपको यह सुनिश्चित करने की आवश्यकता है कि चार या अधिक पंक्तियों को वापस पाने से बचने के लिए प्रत्येक ऑर्डरिंग मान अद्वितीय है।

जबकि आप कर सकते थे कुछ क्रूड पूर्णांक या स्तंभों के स्ट्रिंग संयोजन द्वारा अपना स्वयं का क्रमबद्ध मूल्य बनाएं:

LEFT JOIN article AS a1
ON a1.category_id=a0.category_id
AND HEX(a1.issticky)+HEX(a1.published_at)+HEX(a1.article_id)>HEX(a0.issticky)+HEX(a0.published_at)+HEX(a0.article_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. SQL अद्यतन में str_replace?

  2. PHP के माध्यम से MySQL बल्क इंसर्ट

  3. PHP में MySQL कॉलम का योग प्राप्त करें

  4. स्थिर मूल्यों और गतिशील मूल्यों के साथ MYSQL तालिका

  5. MySQL IFNULL N/A यील्ड आइटम संग्रह में नहीं मिल सकता है त्रुटि