ORDER BY
. का उपयोग करना एक सबक्वेरी में इस समस्या का सबसे अच्छा समाधान नहीं है।
max(post_date)
. प्राप्त करने का सबसे अच्छा समाधान लेखक द्वारा अधिकतम तिथि वापस करने के लिए एक सबक्वायरी का उपयोग करना है और फिर post_author
दोनों पर अपनी तालिका में शामिल होना है और अधिकतम तिथि।
समाधान होना चाहिए:
SELECT p1.*
FROM wp_posts p1
INNER JOIN
(
SELECT max(post_date) MaxPostDate, post_author
FROM wp_posts
WHERE post_status='publish'
AND post_type='post'
GROUP BY post_author
) p2
ON p1.post_author = p2.post_author
AND p1.post_date = p2.MaxPostDate
WHERE p1.post_status='publish'
AND p1.post_type='post'
order by p1.post_date desc
यदि आपके पास निम्न नमूना डेटा है:
CREATE TABLE wp_posts
(`id` int, `title` varchar(6), `post_date` datetime, `post_author` varchar(3))
;
INSERT INTO wp_posts
(`id`, `title`, `post_date`, `post_author`)
VALUES
(1, 'Title1', '2013-01-01 00:00:00', 'Jim'),
(2, 'Title2', '2013-02-01 00:00:00', 'Jim')
;
सबक्वेरी अधिकतम तिथि और इसके लेखक को वापस करने जा रही है:
MaxPostDate | Author
2/1/2013 | Jim
फिर चूंकि आप उस तालिका में वापस शामिल हो रहे हैं, दोनों मूल्यों पर आप उस पोस्ट का पूरा विवरण वापस कर देंगे।
देखें SQL Fiddle with Demo ।
इस डेटा को सटीक रूप से वापस करने के लिए एक सबक्वायरी का उपयोग करने के बारे में मेरी टिप्पणियों पर विस्तार करने के लिए।
MySQL आपको GROUP BY
के लिए बाध्य नहीं करता है हर कॉलम जिसे आप SELECT
. में शामिल करते हैं सूची। परिणामस्वरूप, यदि आप केवल GROUP BY
एक कॉलम लेकिन कुल 10 कॉलम लौटाएं, इस बात की कोई गारंटी नहीं है कि अन्य कॉलम मान जो post_author
से संबंधित हैं जिसे वापस कर दिया जाता है। यदि कॉलम GROUP BY
. में नहीं है MySQL चुनता है कि कौन सा मान लौटाया जाना चाहिए।
कुल फ़ंक्शन के साथ सबक्वायरी का उपयोग करना गारंटी देगा कि सही लेखक और पोस्ट हर बार वापस आ जाता है।
एक साइड नोट के रूप में, जबकि MySQL आपको ORDER BY
. का उपयोग करने की अनुमति देता है एक सबक्वेरी में और आपको GROUP BY
. लागू करने की अनुमति देता है SELECT
. के हर कॉलम में नहीं सूची इस व्यवहार की SQL सर्वर सहित अन्य डेटाबेस में अनुमति नहीं है।