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

MySQL:2 टेबल से नवीनतम संदेश प्राप्त करें जो एक दूसरे से जुड़े हैं

MySQL के पुराने संस्करणों (<8.0.2) में, हम व्युत्पन्न तालिकाएं . व्युत्पन्न तालिका में, हम नवीनतम send_datetime . प्राप्त कर सकते हैं प्रत्येक conversation_id . के लिए मान . साथ ही, यह उल्लेखनीय है कि आप WHERE में बातचीत_आईडी के लिए अपने फ़िल्टर प्रदान कर सकते हैं इस उपश्रेणी का खंड।

फिर हम इस सबक्वेरी के परिणाम-सेट का उपयोग कर सकते हैं और बातचीत में नवीनतम संदेश के अनुरूप पंक्ति प्राप्त करने के लिए उचित रूप से मुख्य तालिकाओं में वापस शामिल हो सकते हैं।

स्कीमा (MySQL v5.7)

डीबी फिडल पर देखें

क्वेरी #1

SELECT
  amc.conversation_id, 
  m.message_id, 
  m.message   
FROM 
  assoc_message__conversation AS amc
JOIN message AS m 
  ON m.message_id = amc.message_id 
JOIN 
(
  SELECT
    amc1.conversation_id, 
    MAX(m1.send_datetime) AS latest_send_datetime
  FROM
   assoc_message__conversation AS amc1
  JOIN message AS m1
    ON m1.message_id = amc1.message_id 
  WHERE amc1.conversation_id IN (1,2)  -- Here you provide your input filters
  GROUP BY amc1.conversation_id
) AS dt  
  ON dt.conversation_id = amc.conversation_id AND 
     dt.latest_send_datetime = m.send_datetime;

परिणाम

| conversation_id | message_id | message        |
| --------------- | ---------- | -------------- |
| 1               | 3          | Latest message |
| 2               | 6          | Latest message |

MySQL 8.0.2 और इसके बाद के संस्करण में, हम Row_Number() . का उपयोग कर सकते हैं कार्यक्षमता। conversation_id . के एक पार्टिशन में , हम send_datetime के अवरोही क्रम में क्रमबद्ध प्रत्येक संदेश के लिए पंक्ति संख्या निर्धारित करेंगे . इस सबक्वेरी में, आप WHERE में बातचीत_आईडी के लिए अपने फ़िल्टर प्रदान कर सकते हैं खंड।

फिर हम इस परिणाम-सेट को व्युत्पन्न तालिका के रूप में उपयोग करेंगे, और केवल उन पंक्तियों पर विचार करेंगे, जहां पंक्ति संख्या मान 1 है (क्योंकि यह नवीनतम send_datetime से संबंधित होगा। )।

स्कीमा (MySQL v8.0)

डीबी फिडल पर देखें

क्वेरी #2

SELECT 
  dt.conversation_id, 
  dt.message_id, 
  dt.message 
FROM 
(
  SELECT
    amc.conversation_id, 
    m.message_id, 
    m.message, 
    ROW_NUMBER() OVER (PARTITION BY amc.conversation_id 
                       ORDER BY m.send_datetime DESC) AS row_no 
  FROM
   assoc_message__conversation AS amc
  JOIN message AS m
    ON m.message_id = amc.message_id 
  WHERE amc.conversation_id IN (1,2)  -- Here you provide your input filters
) AS dt  
WHERE dt.row_no = 1;

परिणाम

| conversation_id | message_id | message        |
| --------------- | ---------- | -------------- |
| 1               | 3          | Latest message |
| 2               | 6          | Latest message |


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल दो टेबल्स से आंतरिक जुड़ने और सीमा के साथ चयन

  2. मैक ओएस एक्स पर MySQL पायथन स्थापित करना

  3. जावा का उपयोग करके MySQL में बाइट [] सम्मिलित नहीं कर सकता

  4. UTF-8:डेटाबेस में सही ढंग से दिखा रहा है, हालांकि utf-8 वर्णसेट के बावजूद HTML में नहीं है

  5. MySQL क्वेरी को Laravel 5.4 क्वेरी बिल्डर में कैसे बदलें