इसे निम्नलिखित के लिए सरल बनाया जा सकता है (ORDER BY
सबक्वेरी में बेकार है):
SELECT *
FROM table
GROUP BY title
आपको क्यों लगता है कि आपको JOIN
की आवश्यकता है? ? (ठीक है, इसे टिप्पणियों द्वारा हल किया गया था)।
आपकी टिप्पणी के बाद कि आपको हर शीर्षक की आवश्यकता है, सबसे बड़ी टाइमस्टैम्प वाली पंक्ति, यह काम करेगी:
SELECT t.*
FROM
table AS t
JOIN
( SELECT title
, MAX(timestamp) AS maxts
FROM table
GROUP BY title
) AS grp
ON grp.title = t.title
AND grp.maxts = t.timestamp
ORDER BY t.timestamp DESC
रिकॉर्ड के लिए, आपकी मूल क्वेरी:
SELECT *
FROM
( SELECT *
FROM table
ORDER BY timestamp DESC
) m
GROUP BY title
हो सकता है अपेक्षानुसार काम करें, लेकिन:केवल MySQL में जो आपको SELECT
. में उपयोग करने की अनुमति देता है सूची फ़ील्ड जो GROUP BY
. में नहीं हैं खंड (या उन पर निर्भर), बिना किसी समग्र कार्य के। तो, उपरोक्त क्वेरी अधिक या कम यादृच्छिक . लौटाएगी प्रत्येक शीर्षक के लिए पंक्ति। वास्तव में, यह एक शीर्षक के लिए मिलने वाली पहली पंक्ति लौटाएगा। इसलिए, सबसे पहले सबक्वेरी (जो timestamp DESC
द्वारा ऑर्डर करता है) को चला रहा है ) सबसे बड़ी टाइमस्टैम्प वाली पहली पंक्ति खोजने में परिणाम देता है।
हालांकि, ऐसा केवल इसलिए होता है क्योंकि (कब, अगर) ऑप्टिमाइज़र यह नहीं समझता है कि सबक्वेरी बेकार है। आप पा सकते हैं कि आपकी मूल क्वेरी ठीक चलती है जब एक दिन आप MySQL संस्करण 7.5 में अपग्रेड करते हैं और आपकी क्वेरी पहले की तरह काम करना बंद कर देती है। (क्योंकि ऑप्टिमाइज़र अधिक चतुर हो गया है और उप-चयन के बिना आपकी क्वेरी को सरल में अनुवादित कर दिया है)।
आप अपनी क्वेरी को पूरी तरह से काम करना बंद करने और त्रुटि उत्पन्न करने के लिए भी पा सकते हैं यदि MySQL भविष्य में रिलीज में GROUP BY
के लिए SQL मानकों के संदर्भ में निर्णय लेता है। प्रश्न।