2016-11-20 59 views
8

我希望能夠按名稱搜索用戶,並得到結果回來只爲行:加入兩個表,但不包括在第三表相匹配條件

  1. 那些我朋友
  2. 這些誰誰不符合我的'事件'。

我有一個查詢,確實一部分#1成功:

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。表是這樣的:

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

旁註:''%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

謝謝@ Fred-ii-。修正了錯字 –

+0

不客氣。我也在他們的問題下發表了一個評論,如果是這種情況並且使用這些類型的報價。 –

相關問題