अगर मैं आपकी आवश्यकता को सही ढंग से समझता हूं, तो आप एक निश्चित उपयोगकर्ता से जुड़े प्रत्येक वार्तालाप के लिए नवीनतम संदेश तिथि प्राप्त करना चाहते हैं। इस मामले में, हम किसी दिए गए उपयोगकर्ता के लिए वार्तालापों को एकत्रित कर सकते हैं और नवीनतम संदेश दिनांक को बनाए रख सकते हैं।
SELECT m1.*
FROM messages m1
INNER JOIN
(
SELECT LEAST(sender_id, recipient_id) AS first,
GREATEST(sender_id, recipient_id) AS second,
MAX(created_at) AS recent_date
FROM messages
WHERE sender_id = 2 OR recipient_id = 2
GROUP BY LEAST(sender_id, recipient_id),
GREATEST(sender_id, recipient_id)
) m2
ON LEAST(m1.sender_id, m1.recipient_id) = m2.first AND
GREATEST(m1.sender_id, m1.recipient_id) = m2.second AND
m1.created_at = m2.recent_date
आउटपुट:
स्पष्टीकरण:
इस क्वेरी में चुनौती दो उपयोगकर्ताओं के बीच बातचीत को एक साथ समूहित करने का तरीका खोजना है। मैंने LEAST/GREATEST
का उपयोग किया है ट्रिक, जो एक तरीका है जिससे हम एक 2 -> 4
. का इलाज कर सकते हैं और 4 -> 2
तार्किक रूप से एक ही बात के रूप में बातचीत। फिर, GROUP BY
. का उपयोग करके , हम बातचीत करने वाले उपयोगकर्ताओं की उस जोड़ी के लिए सबसे हाल की बातचीत की तारीख की पहचान कर सकते हैं। तो उपरोक्त मेरे उत्तर में सबक्वायरी, किसी भी आदेश के संबंध में, उपयोगकर्ताओं की प्रत्येक जोड़ी के लिए, उस जोड़ी को अपनी हालिया वार्तालाप तिथि के साथ ढूंढती है। फिर हम इस परिणाम को वापस messages
. से जोड़ते हैं वास्तविक नवीनतम संदेश पाठ लाने के लिए तालिका।
यहां डेमो करें: