Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

संदेश तालिका से बातचीत क्वेरी करना

अगर मैं आपकी आवश्यकता को सही ढंग से समझता हूं, तो आप एक निश्चित उपयोगकर्ता से जुड़े प्रत्येक वार्तालाप के लिए नवीनतम संदेश तिथि प्राप्त करना चाहते हैं। इस मामले में, हम किसी दिए गए उपयोगकर्ता के लिए वार्तालापों को एकत्रित कर सकते हैं और नवीनतम संदेश दिनांक को बनाए रख सकते हैं।

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 . से जोड़ते हैं वास्तविक नवीनतम संदेश पाठ लाने के लिए तालिका।

यहां डेमो करें:

रेक्सटेस्टर



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL त्रुटि 1064 को कैसे ठीक करें

  2. एसक्यूएल दो टेबल में शामिल हों

  3. MySQL:जहां मौजूद नहीं है वहां डालें

  4. java.sql.SQLException:फ़ील्ड का कोई डिफ़ॉल्ट मान नहीं है

  5. मौजूदा तालिका में ऑटो-इन्क्रीमेंट आईडी जोड़ें?