Postgresql क्वेरी को कनवर्ट करने के लिए सटीक समकक्ष नहीं है जो SELECT DISTINCT ON को MySQL में उपयोग करता है।
Postgresql SELECT DISTINCT ON
Postgresql में, निम्न क्वेरी उन सभी पंक्तियों को समाप्त कर देगी जहां भाव (col1, col2, col3)
मेल खाता है, और यह मिलान वाली पंक्तियों के प्रत्येक सेट के लिए केवल "पहली col4, col5 पंक्ति" रखेगा:
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
तो अगर आपकी टेबल इस तरह है:
col1 | col2 | col3 | col4 | col5
--------------------------------
1 | 2 | 3 | 777 | 888
1 | 2 | 3 | 888 | 999
3 | 3 | 3 | 555 | 555
हमारी क्वेरी (1,2,3) के लिए केवल एक पंक्ति और (3,3,3) के लिए एक पंक्ति रखेगी। परिणामी पंक्तियाँ तब होंगी:
col4 | col5
-----------
777 | 888
555 | 555
कृपया ध्यान दें कि प्रत्येक सेट की "पहली पंक्ति" अप्रत्याशित है, हमारी पहली पंक्ति (888, 999) भी हो सकती है, जब तक कि हम एक ORDER BY निर्दिष्ट नहीं करते:
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
(अभिव्यक्तियों पर DISTINCT सबसे बाईं ओर के ORDER BY भावों से मेल खाना चाहिए, लेकिन ORDER BY में अतिरिक्त भाव हो सकते हैं)।
GROUP BY के लिए MySQL एक्सटेंशन
MySQL GROUP BY के उपयोग को बढ़ाता है ताकि हम गैर-समेकित कॉलम का चयन कर सकें जिसका नाम GROUP BY क्लॉज में नहीं है। जब भी हम गैर-समेकित कॉलम चुनते हैं तो सर्वर उस कॉलम से प्रत्येक समूह से कोई भी मान चुनने के लिए स्वतंत्र होता है, इसलिए परिणामी मान अनिश्चित हो जाएंगे।
तो यह Postgresql क्वेरी:
SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
इस MySQL क्वेरी के समतुल्य माना जा सकता है:
SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3
Postgresql और MySQL दोनों प्रत्येक (col1, col2, col3) के लिए "पहली पंक्ति" लौटाएंगे, और दोनों ही मामलों में लौटाई गई पंक्ति अप्रत्याशित है क्योंकि हमने खंड द्वारा निर्दिष्ट और आदेश नहीं दिया है।
बहुत से लोग इस Postgresql क्वेरी को ORDER BY:
के साथ बदलने के लिए बहुत ललचाएंगे।SELECT DISTINCT ON (col1, col2, col3) col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
इसके साथ:
SELECT col4, col5
FROM (
SELECT col1, col2, col3, col4, col5
FROM tablename
ORDER BY col1, col2, col3, col4
) s
GROUP BY col1, col2, col3
यहाँ विचार एक सबक्वेरी के लिए ORDER BY लागू करना है ताकि जब MySQL समूह col1, col2, col3 द्वारा समूहित हो तो यह col4 और col5 के लिए पहला सामना करने वाला मान रखेगा। विचार अच्छा है, लेकिन गलत है! MySQL col4 और col5 के लिए कोई भी मान चुनने के लिए स्वतंत्र है, और हम नहीं जानते कि कौन से पहले मान सामने आए हैं, यह अनुकूलक पर निर्भर करता है। तो मैं इसे इसमें ठीक कर दूंगा:
SELECT t1.col4, t1.col5
FROM tablename t1 INNER JOIN (SELECT col1, col2, col3, MIN(col4) as m_col4
FROM tablename
GROUP BY col1, col2, col3) s
ON t1.col1=s.col1
AND t1.col2=s.col2
AND t1.col3=s.col3
AND t1.col4=s.m_col4
GROUP BY
t1.col1, t1.col2, t1.col3, t1.col4
लेकिन यह और अधिक जटिल होने लगा है।
निष्कर्ष
एक सामान्य नियम के रूप में, Postgresql क्वेरी को MySQL क्वेरी में बदलने का कोई सटीक तरीका नहीं है, लेकिन बहुत सारे वर्कअराउंड हैं, परिणामी क्वेरी मूल के समान सरल हो सकती है या यह बहुत जटिल हो सकती है, लेकिन यह इस पर निर्भर करता है क्वेरी ही।