2012-12-20 45 views
5

मैं 4 टेबलएसक्यूएल प्रश्नों का उपयोग कर मौजूद है और OR ऑपरेटर

है
users 
    | id |Username| 
    | 1 | John | 
    | 2 | Mike | 
    | 3 | Alex | 

    user_contacts 
    | user_id |contact_id| 
    | 1  | 2  | 
    | 1  | 3  | 
    | 2  | 3  | 

    contact_groups 
    | id | Group name | 
    | 1 | Group 1 | 
    | 2 | Group 2 | 
    | 3 | Group 3 | 

    user_contact_groups 
    | user_id |contact_group_id| 
    | 1  | 1   | 
    | 1  | 2   | 
    | 3  | 2   | 

क्या आईडी करना पसंद है उन समूह 1 और 3 या उपयोगकर्ता 1 के एक संपर्क संपर्क के अंतर्गत आता है जो खींचने के लिए (तालिका में: user_contacts) । नीचे दिए गए कोड है, लेकिन यह रिटर्न क्वेरी खाली है

SELECT DISTINCT a.* from users as a 
WHERE EXISTS (SELECT * FROM user_contacts as b 
    WHERE b.user_id = 1) OR 
    (a.id IN (select c.user_id 
     FROM user_contact_groups as c 
      WHERE c.contact_group_id IN (1,3))); 
+2

यह हमेशा अपने 'users' मेज से सभी पंक्तियों को वापस चाहिए में पहली शर्त के रूप में आपका WHERE खंड प्रभावी रूप से '1 = 1' है। – Perception

+0

उपयोगकर्ता_आईडी भिन्न होता है। मुझे% d के साथ 1 को प्रतिस्थापित करना चाहिए। धन्यवाद – user1917451

उत्तर

5

यह मैं इसे कैसे करना होगा, और सबसे इष्टतम होना चाहिए:

SELECT DISTINCT u.* 
FROM users u 
LEFT OUTER JOIN user_contacts c ON u.id = c.contact_id 
    AND c.user_id = 1 
LEFT OUTER JOIN user_contact_groups g ON u.user_id = g.user_id 
    AND g.contact_group_id IN (1,3) 
WHERE c.id IS NOT NULL OR g.id IS NOT NULL 

आप मौजूद उपयोग करना चाहता था, तो आप निश्चित रूप से इस घूम सकते हैं, लेकिन क्वेरी अनुक्रमित उपयोग करने के लिए (आप इस प्रश्न के लिए Distict निकाल सकते हैं) सक्षम नहीं हो सकता:

SELECT * 
FROM users u 
WHERE EXISTS 
(
    SELECT 1 
    FROM user_contacts c 
    WHERE c.contact_id = u.id 
    AND c.user_id = 1 
) 
OR EXISTS 
(
    SELECT 1 
    FROM user_contact_groups g 
    WHERE g.user_id = u.user_id 
    AND g.contact_group_id IN (1,3) 
) 

मैं एक व्याख्या का सुझाव देते हैं और देखें कि आपके आरडीबीएमएस के लिए कौन सा बेहतर है।

+0

शानदार! मैंने उपर्युक्त मेरी तालिका में बदलाव किए हैं और आखिरी जगह को हटाने का प्रयास किया है जहां आपके कोड में क्लॉज है, जहां सी.आईडी नहीं है या g.id बिल्कुल नहीं है ... लेकिन क्वेरी क्वेरी खाली है। धन्यवाद – user1917451

+0

यह काम करता है !! मुझे अपने कोड में एक त्रुटि हुई और इसे ठीक कर दिया। मदद के लिए धन्यवाद। – user1917451

+0

यह वह कोड है जो मेरे लिए काम करता है: DISTINCT A का चयन करें। * उपयोगकर्ताओं से बाएं जॉइन उपयोगकर्ता के रूप में संपर्क करें। A.id = b.contact_id पर b.user_id =% d LEFT JO_ user_contact_groups c.user_id = a पर c के रूप में .id और c.contact_group_id IN (% s) जहां b.user_id पूर्ण नहीं है या c.user_id नहीं है – user1917451

3

कर सबक्वेरी के बजाय आप बाईं मिलती

SELECT DISTINCT a.* 
FROM users as a 
LEFT JOIN user_contacts as b ON a.id = b.user_id AND a.id = 1 
LEFT JOIN user_contact_groups as c on c.user_id = a.id AND c.contact_group_id IN (1,3) 
WHERE b.user_id IS NOT NULL OR c.user_id IS NOT NULL 

मैं इस परीक्षण करने के लिए मेरे सामने एसक्यूएल की जरूरत नहीं है, लेकिन मुझे लगता है कि कर सकता है यह मिल जाएगा सही परिणाम

+0

सहायता के लिए धन्यवाद, मैंने उपरोक्त तालिका को अपडेट किया है। माफ करना मेरा बुरा। – user1917451

+0

@ user1917451 मैंने अपना जवाब अपडेट कर दिया है। कोई वास्तविक परिवर्तन आवश्यक नहीं है, जहां क्लॉज – Greg

+0

में एक अलग फ़ील्ड की जांच कर रहा है यह अजीब है, मुझे अभी भी एसक्यूएल: त्रुटि: क्वेरी खाली थी । अन्य उत्तरों के साथ ही परिणाम .. हम्म – user1917451

1

EXISTS ऑपरेटर का उपयोग सबक्वायरी में किसी भी रिकॉर्ड के अस्तित्व के परीक्षण के लिए किया जाता है।

एक्स्ट्रा ऑपरेटर एक या अधिक रिकॉर्ड लौटाता है तो EXISTS ऑपरेटर सत्य लौटाता है।

SELECT column_name(s) FROM table_name WHERE EXISTS (SELECT column_name FROM table_name WHERE condition); 

निम्नलिखित एसक्यूएल बयान सही वापस आती है और एक उत्पाद की कीमत कम 20 से साथ आपूर्तिकर्ताओं को सूचीबद्ध करता है:

SELECT SupplierName FROM Suppliers WHERE EXISTS (SELECT ProductName FROM Products WHERE SupplierId = Suppliers.supplierId AND Price < 20);