इस पर कुछ ध्यान देने की आवश्यकता है कि शर्त को कहाँ रखा जाए (where
या on
?) ताकि आप धोखे में न आएं :-) आपको t1 के लिए where
की शर्त जोड़नी होगी खंड और t2 से on
. के लिए खंड:
SELECT t1.type, t1.name, t1.value
FROM mytable t1
LEFT JOIN mytable t2 ON t1.type = t2.type AND t1.value > t2.value
AND t2.popularity > 3 /* here */
WHERE t2.value IS NULL
AND t1.popularity > 3 /* and here */
इसका परीक्षण नहीं किया है, लेकिन इसे काम करना चाहिए।
स्पष्टीकरण का प्रयास करें: वह स्थिति जिसमें क्लॉज प्रभावित करता है कि आप किन तत्वों को सबसे कम मूल्य वाले संभावित तत्व मानते हैं। जबकि on
. में शर्त क्लॉज लिंकेज को प्रभावित करता है:आप इसकी तुलना किन अन्य तत्वों से करना चाहते हैं? यह उस समूह को परिभाषित करता है जिसके भीतर आप तुलना करते हैं। तकनीकी रूप से, इसका प्रभाव तब पड़ता है जब t2.* NULL होगा। अगर आपने t2.popularity पर where
. को कंडीशन दी होती इसके बजाय, आपको उन समूहों के लिए कोई NULLs (अर्थात w/निम्नतम मान वाले तत्व नहीं मिलेंगे) प्राप्त नहीं होंगे, जहां निम्नतम तत्वों की लोकप्रियता कम है।