2016-11-20 9 views
8

मैं केवल के लिए के लिए नाम से उन खोज और परिणामों को वापस प्राप्त करने में सक्षम होना चाहता हूँ को बाहर:दो तालिकाओं में शामिल हों लेकिन पंक्तियों को एक तिहाई तालिका में हालत से मेल

  1. जो लोग मेरे साथ
  2. उन मित्रों हूँ जो पहले से ही मेरे 'घटना' के साथ गठबंधन नहीं कर रहे हैं।

    SELECT u.id, first_name, last_name 
    FROM user u 
    JOIN friend f 
    ON (
        (f.requester_id = u.id AND f.recipient_id = :my_user_id) 
        OR (f.recipient_id = u.id AND f.requester_id = :my_user_id) 
        AND confirmed = 1 
    ) 
    AND (
        (first_name LIKE :search_input OR last_name LIKE :search_input) 
        OR (CONCAT (first_name, ' ', last_name) LIKE :search_input) 
    ) 
    AND NOT u.id = :my_user_id 
    ORDER BY last_name 
    LIMIT 5 
    

    भाग # 2 को जोड़ने का तरीका पता लगाने के लिए संघर्ष:

मैं एक प्रश्न उस भाग # 1 सफलतापूर्वक करता है। टेबल्स इस तरह दिखेगा:

USER 
id | first_name | last_name 
-- | ---------- | --------- 
0 | John  | Doe 
1 | Jane  | Doe 
2 | Bob  | Smith 
3 | Mike  | Jones 

FRIEND 
id | requester_id | recipient_id | confirmed 
-- | ------------ | ------------ | --------- 
0 | 0   | 1   | 1 
1 | 3   | 1   | 1 
2 | 2   | 3   | 1 
3 | 1   | 2   | 1 

USER_EVENT 
id | user_id | event_id 
-- | ------- | -------- 
0 | 0  | 43     
1 | 0  | 846     
2 | 0  | 1058    
3 | 1  | 846  
4 | 1  | 912     
5 | 2  | 537     
6 | 3  | 846 

नमूना डेटा एक प्रश्न मिल सकता है:

:search_input (e.g. '%bob%') 
:my_user_id (e.g. 3) 
:event_id (e.g. 846) 
+0

Sidenote: ''% bob%' 'सुनिश्चित करें कि आप उन घुंघराले उद्धरणों का उपयोग नहीं करते हैं। इसे '% bob%' के रूप में पढ़ना चाहिए। अन्यथा, आपका कोड एक पार्स त्रुटि को मिटा देगा। –

+0

इसे इंगित करने के लिए धन्यवाद। –

उत्तर

5

आप बस आपकी क्वेरी के लिए एक और खंड जोड़ सकते हैं: AND user_id NOT IN (SELECT user_id from USER_EVENT where event_id = :event_id)

पूर्ण क्वेरी:

SELECT u.id, first_name, last_name 
FROM user u 
JOIN friend f 
ON (
    (f.requester_id = u.id AND f.recipient_id = :my_user_id) 
    OR (f.recipient_id = u.id AND f.requester_id = :my_user_id) 
    AND confirmed = 1 
) 
AND (
    (first_name LIKE :search_input OR last_name LIKE :search_input) 
    OR (CONCAT (first_name, ' ', last_name) LIKE :search_input) 
) 
AND NOT u.id = :my_user_id 
AND user_id NOT IN (SELECT user_id from USER_EVENT where event_id = :event_id) 
ORDER BY last_name 
LIMIT 5 
+0

'event_id' और' envet_id' –

+0

धन्यवाद @ फ्रेड-आईआई-। टाइपो –

+0

तय किया गया आपका स्वागत है। मैंने उनके प्रश्न के तहत एक टिप्पणी भी पोस्ट की, क्या यह मामला होना चाहिए और उन प्रकार के उद्धरणों का उपयोग करना चाहिए। –

संबंधित मुद्दे