आपका समाधान ग्रुप बाय क्लाज के लिए एक एक्सटेंशन का उपयोग करता है जो कुछ क्षेत्रों द्वारा समूह को अनुमति देता है (इस मामले में, बस post_author
):
GROUP BY wp_posts.post_author
और गैर-पृथक कॉलम चुनें:
SELECT wp_posts.*
जो समूह में खंड द्वारा सूचीबद्ध नहीं हैं, या जिनका उपयोग कुल कार्य (MIN, MAX, COUNT, आदि) में नहीं किया गया है।
समूह द्वारा खंड के विस्तार का सही उपयोग
यह तब उपयोगी है जब गैर-एकत्रित कॉलम के सभी मान हर पंक्ति के लिए समान हों।
उदाहरण के लिए, मान लीजिए कि आपके पास एक टेबल है GardensFlowers
( name
बगीचे की, flower
जो बगीचे में उगती है):
INSERT INTO GardensFlowers VALUES
('Central Park', 'Magnolia'),
('Hyde Park', 'Tulip'),
('Gardens By The Bay', 'Peony'),
('Gardens By The Bay', 'Cherry Blossom');
और आप एक बगीचे में उगने वाले सभी फूलों को निकालना चाहते हैं, जहां कई फूल उगते हैं। फिर आपको एक उपशम का उपयोग करना होगा, उदाहरण के लिए आप इसका उपयोग कर सकते हैं:
SELECT GardensFlowers.*
FROM GardensFlowers
WHERE name IN (SELECT name
FROM GardensFlowers
GROUP BY name
HAVING COUNT(DISTINCT flower)>1);
यदि आपको उन सभी फूलों को निकालने की आवश्यकता है जो इसके बजाय माली के एकमात्र फूल हैं, तो आप सिर्फ HAVING की स्थिति को बदल सकते हैं HAVING COUNT(DISTINCT flower)=1
, लेकिन MySql भी आपको इसका उपयोग करने की अनुमति देता है:
SELECT GardensFlowers.*
FROM GardensFlowers
GROUP BY name
HAVING COUNT(DISTINCT flower)=1;
कोई उपवर्ग नहीं, मानक एसक्यूएल नहीं, लेकिन सरल।
ग्रुप बाय क्लाज द्वारा एक्सटेंशन का गलत उपयोग
लेकिन क्या होगा यदि आप गैर-एकत्रित स्तंभों का चयन करते हैं जो हर पंक्ति के लिए समान नहीं हैं? वह मान क्या है जो MySql उस कॉलम के लिए चुनता है?
ऐसा लगता है कि MySql हमेशा अपने द्वारा सामना किए जाने वाले FIRST मूल्य को चुनता है ।
यह सुनिश्चित करने के लिए कि इसका पहला मूल्य आपके द्वारा वांछित मूल्य है, आपको GROUP BY
एक ऑर्डर किए गए क्वेरी को लागू करने की आवश्यकता है, इसलिए उप-वर्ग का उपयोग करने की आवश्यकता है। आप इसे अन्यथा नहीं कर सकते।
इस धारणा को देखते हुए कि MySql हमेशा पहली पंक्ति को चुनता है जिससे उसका सामना होता है, आप हर बार पंक्तियों को GROUP BY से पहले छांट रहे हैं। लेकिन दुर्भाग्य से, यदि आप प्रलेखन को ध्यान से पढ़ते हैं, तो आप देखेंगे कि यह धारणा सही नहीं है।
गैर-एकत्रित कॉलम का चयन करते समय, जो हमेशा समान नहीं होते हैं, MySql किसी भी मूल्य का चयन करने के लिए स्वतंत्र है, इसलिए परिणामी मूल्य जो वास्तव में दिखाता है वह अनिश्चित है ।
मैं देखता हूं कि गैर-एकत्रित कॉलम का पहला मूल्य प्राप्त करने के लिए इस ट्रिक का बहुत उपयोग किया जाता है, और यह आमतौर पर / लगभग हमेशा काम करता है, मैं इसे कभी-कभी (अपने जोखिम पर) उपयोग करता हूं। लेकिन चूंकि यह प्रलेखित नहीं है, इसलिए आप इस व्यवहार पर भरोसा नहीं कर सकते।
यह लिंक (धन्यवाद ypercube!) ग्रुप बाय ट्रिक को ऑप्टिमाइज़ किया गया है एक ऐसी स्थिति को दिखाता है जिसमें एक ही क्वेरी MySql और MariaDB के बीच अलग-अलग परिणाम देता है, शायद एक अलग अनुकूलन इंजन के कारण।
तो, अगर यह चाल काम करती है, तो यह सिर्फ भाग्य की बात है।
अन्य सवाल पर स्वीकार किए जाते हैं जवाब मेरे लिए गलत लग रहा है:
HAVING wp_posts.post_date = MAX(wp_posts.post_date)
wp_posts.post_date
एक गैर-एकत्रित कॉलम है, और इसका मूल्य आधिकारिक तौर पर अनिर्धारित होगा, लेकिन यह संभवतः पहले post_date
सामना किया जाएगा। लेकिन चूंकि ग्रुप बाय ट्रिक को अनऑर्डर्ड टेबल पर लागू किया जाता है, इसलिए यह सुनिश्चित नहीं होता है कि पहले post_date
सामना किया गया है।
यह शायद उन पदों को लौटाएगा जो किसी एकल लेखक के एकमात्र पद हैं, लेकिन यहां तक कि यह हमेशा निश्चित नहीं होता है।
एक संभावित समाधान
मुझे लगता है कि यह एक संभावित समाधान हो सकता है:
SELECT wp_posts.*
FROM wp_posts
WHERE id IN (
SELECT max(id)
FROM wp_posts
WHERE (post_author, post_date) = (
SELECT post_author, max(post_date)
FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY post_author
) AND wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY post_author
)
भीतर की क्वेरी पर मैं हर लेखक के लिए अधिकतम पोस्ट डेट लौटा रहा हूं। मैं तब इस तथ्य पर विचार कर रहा हूं कि एक ही लेखक के पास एक ही समय में दो पद हो सकते हैं, इसलिए मुझे केवल अधिकतम आईडी मिल रही है। और फिर मैं उन सभी पंक्तियों को वापस कर रहा हूं जिनमें उन अधिकतम आईडी हैं। इसे IN क्लॉज के बजाय जॉइन का इस्तेमाल करके तेजी से बनाया जा सकता है।
(यदि आपको यकीन है कि ID
यह केवल बढ़ रहा है, और यदि ID1 > ID2
इसका मतलब यह भी है post_date1 > post_date2
, तो क्वेरी को और अधिक सरल बनाया जा सकता है, लेकिन मुझे यकीन नहीं है कि यह मामला है)।
post_author
औरpost_date
एक अद्वितीय पंक्ति प्राप्त करने के लिए पर्याप्त नहीं है, इसलिए प्रति अद्वितीय पंक्ति प्राप्त करने के लिए अधिक होना चाहिएpost_author