मैं हर समय इस समस्या में भागता हूं। जब MySQL किसी भी गैर-एकत्रित कॉलम के लिए एक समग्र फ़ंक्शन चलाता है, तो यह उस समूह के लिए पहले डेटा को खींचता है, चाहे वह MAX पंक्ति से हो या नहीं। तो आपको क्या करना है डेटा को एक आंतरिक क्वेरी में ऑर्डर करना है जैसे कि अधिकतम उनके समूहों में पहले हैं। देखें कि क्या यह आपके लिए काम करता है:
SELECT t.post_id,
t.profile_id,
t.score,
t.pubdate_utc
FROM (SELECT p.profile_id,
p.post_id,
p.pubdate_utc,
(pp.comments + pp.likes + pp.favorites) score
FROM posts p
JOIN posts_points pp ON p.post_id = pp.post_id
WHERE p.pubdate_utc >= DATE_ADD(DATE(NOW()), INTERVAL -17 DAY)
ORDER BY score DESC
) t
GROUP BY DATE(t.pubdate_utc) DESC
;
ध्यान दें कि मैं यहां MAX फ़ंक्शन का उपयोग नहीं करता हूं। स्कोर अवरोही के आधार पर क्रमित करना और फिर बाहरी क्वेरी में तिथि के अनुसार समूह बनाना तिथि के अनुसार उच्चतम स्कोर प्राप्त करेगा। यह भी ध्यान दें कि मैंने WHERE क्लॉज को आंतरिक क्वेरी में रखा है। इस तरह के आंतरिक प्रश्न (कभी-कभी आवश्यक होते हैं) बहुत कुशल नहीं होते हैं, क्योंकि बाहरी क्वेरी को अनुकूलित करने के लिए उनके पास कोई अनुक्रमणिका नहीं होती है, इसलिए सुनिश्चित करें कि आपका आंतरिक परिणाम सेट जितना छोटा हो सकता है। अंत में, ग्रुप बाय DATE(t.pubdate_utc) पर ध्यान दें। अगर मैंने इसे केवल तारीख की जानकारी तक कम नहीं किया, तो 18 से अधिक परिणाम होंगे, क्योंकि समय भी गिना जाता है।
संपादित करें:INTERVAL -17 DAY
में बदला गया 19 के बजाय 18 परिणाम देने के लिए।