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

अनेक-से-अनेक संबंध में मिलान उपसमुच्चय का चयन करना

Select project_ID 
from user_projects
where user_ID in (1,2)
group by project_ID
Having count(*) = 2

आप जानते हैं कि आपके पास 2 उपयोगकर्ता हैं, आप जानते हैं कि वे अद्वितीय (प्राथमिक कुंजी) होंगे, इसलिए आप जानते हैं कि यदि एक ही प्रोजेक्ट के लिए 2 रिकॉर्ड हैं, तो यह वही है जो आप चाहते हैं।

आपके प्रश्न ने संकेत दिया कि आपके पास उपयोगकर्ताओं का एक GIVEN भेजा गया है, जिसके लिए आप जानते हैं कि उपयोगकर्ता क्या हैं और कितने हैं। उपरोक्त SQL को इन ज्ञात के लिए पैरामीटर स्वीकार करने के लिए अद्यतन किया जा सकता है और इस प्रकार गतिशील रहता है, केवल 2 उपयोगकर्ताओं तक सीमित नहीं है।

where user_ID in (userlist)
having count(*) = (cntuserList)

----------- स्थिति को संभालने के लिए जब उपयोगकर्ताओं का सेट खाली हो-----

Select P.project_ID 
from Projects P
LEFT JOIN user_projects UP
where (UP.user_ID in (1,2) OR UP.USER_ID is null)
group by project_ID
Having count(*) = 2

तो यहाँ यह क्या करता है। यह सभी परियोजनाओं को लौटाता है और यदि उस परियोजना से संबद्ध कोई उपयोगकर्ता है तो यह उनकी पहचान करता है। यदि आप सेट में उपयोगकर्ता शामिल हैं, तो लौटाई गई परियोजनाओं की सूची को उस सेट द्वारा फ़िल्टर किया जाता है ताकि यह सुनिश्चित हो सके कि पूरा सेट प्रोजेक्ट में होने वाले खंड के माध्यम से है।

यदि सेट खाली है, तो उपयोगकर्ता आईडी के साथ बाएं शामिल हों, शून्य कथन है, परियोजनाओं को सूचीबद्ध नहीं करेगा, भले ही सेट खाली हो या नहीं। होने वाला क्लॉज सेट को आपके द्वारा सेट में परिभाषित # उपयोगकर्ताओं तक कम कर देगा, या 0 सभी प्रोजेक्ट्स को वापस करने का संकेत देगा जिसमें कोई उपयोगकर्ता असाइन नहीं किया गया है।

एक अतिरिक्त बढ़त का मामला जिस पर हमने अभी तक चर्चा नहीं की है, वह यह है कि यदि किसी प्रोजेक्ट में आपके द्वारा सेट में परिभाषित उपयोगकर्ता से अधिक उपयोगकर्ता हैं तो क्या होना चाहिए। वर्तमान में यह परियोजना वापस की जाएगी; लेकिन मैं सकारात्मक नहीं हूं कि आप यही चाहते थे।

एक साइड नोट पर मुझे सोचने के लिए धन्यवाद। मुझे अब कोड में उतना नहीं जाना है; यही कारण है कि मैं समय-समय पर यहां ट्रोल करता हूं यह देखने के लिए कि क्या मैं मदद कर सकता हूं!



  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.3 में वर्तमान समयक्षेत्र का नाम कैसे प्राप्त करूं?

  2. "PostgreSQL 9.0 उच्च प्रदर्शन" पुस्तक प्रकाशित हो चुकी है।

  3. PostgreSQL के लिए अच्छा OleDB/ODBC प्रदाता

  4. टेक्स्ट पर अजीब वर्णों का चयन करें, LIKE ऑपरेटर के साथ काम नहीं कर रहा है

  5. स्प्रिंग बूट पर हाइबरनेट के साथ PostGIS ज्यामिति बिंदु फ़ील्ड को मैप करें