यह संबंधपरक विभाजन का मामला है . हमने इस संबंधित प्रश्न के तहत तकनीकों का एक शस्त्रागार इकट्ठा किया है:
विशेष कठिनाई अतिरिक्त उपयोगकर्ताओं को बाहर करना है। मूल रूप से 4 तकनीकें हैं।
मेरा सुझाव है कि LEFT JOIN
/ IS NULL
:
SELECT cu1.conversation_id
FROM conversation_user cu1
JOIN conversation_user cu2 USING (conversation_id)
LEFT JOIN conversation_user cu3 ON cu3.conversation_id = cu1.conversation_id
AND cu3.user_id NOT IN (3,32)
WHERE cu1.user_id = 32
AND cu2.user_id = 3
AND cu3.conversation_id IS NULL;
या NOT EXISTS
:
SELECT cu1.conversation_id
FROM conversation_user cu1
JOIN conversation_user cu2 USING (conversation_id)
WHERE cu1.user_id = 32
AND cu2.user_id = 3
AND NOT EXISTS (
SELECT 1
FROM conversation_user cu3
WHERE cu3.conversation_id = cu1.conversation_id
AND cu3.user_id NOT IN (3,32)
);
दोनों क्वेरी नहीं करती हैं एक UNIQUE
पर निर्भर करते हैं (conversation_id, user_id)
. के लिए बाधा , जो जगह में हो भी सकता है और नहीं भी। मतलब, क्वेरी तब भी काम करती है जब user_id
32 (या 3) एक ही बातचीत के लिए एक से अधिक बार सूचीबद्ध है। आप करेंगे हालांकि, परिणाम में डुप्लिकेट पंक्तियाँ प्राप्त करें, और DISTINCT
apply लागू करने की आवश्यकता है या GROUP BY
.
एकमात्र शर्त वह है जिसे आपने तैयार किया है:
अंकेक्षित क्वेरी
टिप्पणी में आपके द्वारा लिंक की गई क्वेरी काम नहीं करेगा। आप अन्य प्रतिभागियों को बाहर करना भूल गए। कुछ इस तरह होना चाहिए:
SELECT * -- or whatever you want to return
FROM conversation_user cu1
WHERE cu1.user_id = 32
AND EXISTS (
SELECT 1
FROM conversation_user cu2
WHERE cu2.conversation_id = cu1.conversation_id
AND cu2.user_id = 3
)
AND NOT EXISTS (
SELECT 1
FROM conversation_user cu3
WHERE cu3.conversation_id = cu1.conversation_id
AND cu3.user_id NOT IN (3,32)
);
जो अन्य दो प्रश्नों के समान है, सिवाय इसके कि यह एकाधिक पंक्तियों को नहीं लौटाएगा यदि user_id = 3
कई बार जुड़ा हुआ है।