सभी जोड़े प्राप्त करने का एक विकल्प, चाहे वे आगे या पीछे हों (उदाहरण के लिए (1, 2) ==(2, 1)) LEAST()
का चयन करना है और GREATEST()
प्रत्येक पंक्ति से, और फिर भिन्न मानों का चयन करें। इस क्वेरी का उपयोग करना:
SELECT DISTINCT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)
FROM myTable;
आपको निम्न आउटपुट मिलेगा:
| 1 | 2 |
| 1 | 3 |
एक बार आपके पास यह हो जाने के बाद, आप प्रत्येक जोड़ी के लिए अधिकतम तिथि प्राप्त करने के लिए इनके द्वारा समूह बना सकते हैं:
SELECT LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id), MAX(created_at)
FROM myTable
GROUP BY LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id);
यह क्वेरी आपको प्रत्येक जोड़ी के लिए आवश्यक डेटा देगी, लेकिन यह आपकी मूल तालिका से वास्तविक पंक्ति नहीं लौटाएगी। यदि प्रारूप की एक पंक्ति है | 2 | 1 | 2014-10-15 |
यह क्वेरी वापस आ जाएगी | 1 | 2 | 2014-10-15
।
अपनी तालिका से मूल पंक्ति प्राप्त करने के लिए, आपको JOIN
. की आवश्यकता होगी इस शर्त पर कि सभी आवश्यक कॉलम मेल खाते हों:
SELECT m.*
FROM myTable m
JOIN(
SELECT LEAST(sender_id, recipient_id) AS least,
GREATEST(sender_id, recipient_id) AS greatest,
MAX(created_at) AS maxDate
FROM myTable
GROUP BY LEAST(sender_id, recipient_id), GREATEST(sender_id, recipient_id)) tmp
ON tmp.least = LEAST(m.sender_id, m.recipient_id) AND tmp.greatest = GREATEST(m.sender_id, m.recipient_id) AND tmp.maxDate = m.created_at;
यह रहा एक SQL Fiddle उदाहरण जो आपके अपेक्षित परिणामों से मेल खाता है।