2013-05-19 148 views
15

我有兩個表:A和B通過「group_id」鏈接。
2變量我使用:$keyword, $_SESSION['user_id']MySQL LEFT JOIN多個條件


GROUP_ID
關鍵字


ID
GROUP_ID
user_id說明

我希望能夠根據關鍵字搜索選擇該用戶不在的所有組。

因此,我們的目標是選擇A中的所有行WHERE user_id!= {$ _ SESSION ['user_id'}作爲B中相應的group_id,就像關鍵字一樣。

這是我的嘗試:

SELECT a.* 
FROM a 
LEFT JOIN b ON a.group_id=b.group_id 
WHERE a.keyword LIKE '%".$keyword."%' 
AND b.user_id!=$_SESSION{['user_id']} 
GROUP BY group_id 

但是,它沒有找到任何行(匹配),除非我刪除AND b.user_id!=$_SESSION{['user_id']}在這種情況下,它也包括羣體的用戶已經在 - 這不是什麼我想要。

任何幫助,將不勝感激!由於

+0

http://en.wikipedia.org/wiki/Prepared_statements – Brandon

回答

30

只需推動額外的條件進入參加關於標準,這種方式不要求B的存在,返回一個結果

SELECT a.* FROM a 
    LEFT JOIN b ON a.group_id=b.group_id AND b.user_id!=$_SESSION{['user_id']} 
    WHERE a.keyword LIKE '%".$keyword."%' 
    GROUP BY group_id 
+0

感謝回答,然而,這並不行。它只是返回表'a'中的所有行,包括b.user_id等於$ _SESSION ['user_id']的那些行。我不知道爲什麼,但我認爲它與左連接的事實有關? –

+1

我覺得你已經足夠接近知道答案:)嘗試使用INNER JOIN而不是左連接 – Bryan

+1

沒有INNER JOIN不起作用。如果我使用INNER JOIN,那麼它只會從表A中取出表B中具有相應的group_id的行。我需要它全部拉取表A中的行,除了user_id = $ _SESSION ['user_id'](對於那個特定的group_id)在B. –

0
SELECT * FROM a WHERE a.group_id IN 
(SELECT group_id FROM b WHERE b.user_id!=$_SESSION{'[user_id']} AND b.group_id = a.group_id) 
WHERE a.keyword LIKE '%".$keyword."%'; 
6

正確的答案很簡單:

SELECT a.group_id 
FROM a 
LEFT JOIN b ON a.group_id=b.group_id and b.user_id = 4 
where b.user_id is null 
    and a.keyword like '%keyword%' 

這裏我們檢查user_id = 4(你的用戶名來自會話)。由於我們在加入標準中使用了它,它會爲表b中任何不符合條件的行返回空值 - 即,該user_id不在其中的任何組。對於空值過濾器,我們有所有你的用戶是不是在組。

demo here