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

SQL में किसी निश्चित उपयोगकर्ता की प्रत्येक बातचीत में नवीनतम संदेश कैसे प्राप्त करें?

मान लें कि उपयोगकर्ता आईडी 1 . के साथ हैं और 3 , जैसा आपने फिडेल में किया था, हम नवीनतम created_at संदेश में रुचि रखते हैं और (sender_id, receiver_id) होने के नाते (1,3) या (3,1)

सिंटैक्स को छोटा बनाने के लिए आप तदर्थ पंक्ति प्रकारों का उपयोग कर सकते हैं:

SELECT * 
FROM   messages 
WHERE  (sender_id, receiver_id) IN ((1,3), (3,1))
ORDER  BY created_at DESC
LIMIT  1;

या स्पष्ट रूप से (और थोड़ा तेज़, इंडेक्स के साथ उपयोग करना भी आसान):

SELECT * 
FROM   messages 
WHERE (sender_id = 1 AND receiver_id = 3 OR
       sender_id = 3 AND receiver_id = 1)
ORDER  BY created_at DESC
LIMIT  1;

सभी के लिए उपयोगकर्ता की बातचीत

टिप्पणी में अनुरोध के अनुसार समाधान जोड़ा गया।

SELECT DISTINCT ON (user_id) *
FROM (
   SELECT 'out' AS type, id, receiver_id AS user_id, body, created_at
   FROM   messages 
   WHERE  sender_id = 1

   UNION  ALL
   SELECT 'in' AS type, id, sender_id AS user_id, body, created_at
   FROM   messages 
   WHERE  receiver_id = 1
   ) sub
ORDER  BY user_id, created_at DESC;

अंतिम पंक्ति के निष्कर्षण को सरल बनाने के लिए यहां दृष्टिकोण विदेशी प्रेषक / रिसीवर को एक कॉलम में मोड़ना है।

DISTINCT ON . के लिए विस्तृत विवरण इस संबंधित उत्तर में:
समूह द्वारा प्रत्येक समूह में पहली पंक्ति का चयन करें?

-> अपडेट किया गया SQLfiddle

बेला में बेहतर और सरलीकृत परीक्षण मामले पर भी विचार करें।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres 9 . में वर्तमान तिथि को अद्यतन करने के लिए ट्रिगर

  2. यदि मैं पहले से ही GIN अनुक्रमणिका का उपयोग कर रहा हूँ तो क्वेरी का अनुकूलन कैसे करें

  3. कथन के साथ कच्चे प्रश्नों को निष्पादित करने के लिए अजगर sqlalchemy का उपयोग करना

  4. उबंटू पर पोस्टग्रेस्क्ल को पूरी तरह से शुद्ध और पुनर्स्थापित कैसे करें?

  5. Postgresql द्वारा उत्पन्न अनुक्रम से पहले एक स्ट्रिंग को उपसर्ग कैसे करें?