मान लें कि उपयोगकर्ता आईडी 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
. के लिए विस्तृत विवरण इस संबंधित उत्तर में:
समूह द्वारा प्रत्येक समूह में पहली पंक्ति का चयन करें?
बेला में बेहतर और सरलीकृत परीक्षण मामले पर भी विचार करें।