2010-01-22 130 views
0

我正在創建一個表,顯示當前用戶尚未訂閱的所有註冊用戶。但是,一旦他訂閱了某人,我需要過濾該列表以排除這些列表。用戶/訂閱者sql查詢

我們假設一張名爲的表格訂閱了,其中列出了用戶以及他訂閱的用戶。

|UserId||SubscriberID| 

它很容易使之成爲多個查詢,但我一直在努力失敗,使之成爲一個查詢,拯救MySQL的額外的循環調用。

這是我有什麼至今:

SELECT u.UserID, FullName, UserName from users u 
    LEFT JOIN subscribed t ON 
    ((u.UserName LIKE '%$search%' OR 
     u.Email LIKE '%$search%') AND 
     ({$_SESSION['ID']} = t.UserID 
     AND t.FollowerID != u.UserID) 
    ) 

我知道查詢的最後一部分是錯誤的,如果用戶名和FollowerID不匹配一個特定行,而不是因爲我只比較整個桌子。

+0

最後部分需要查詢的WHERE子句中,所以它會在每一行中工作,而比加入整個桌子... – 2010-01-22 02:55:29

+0

似乎沒有改變任何東西。你能詳細說明嗎? – 2010-01-22 03:05:35

回答

0

要查找表A中不在表B中的結果列表,您有兩個選項。使用NOT IN語法或LEFT JOIN並查看B表中PK字段的位置是NULL

NOT IN例如:

SELECT a.id FROM a WHERE a.id NOT IN (SELECT b.id FROM b)

LEFT JOIN例如:

SELECT a.id FROM a LEFT JOIN b ON (a.id = b.id) WHERE (b.id IS NULL)

+1

我應該提到,在子查詢中使用'NOT IN'將需要MySQL 5.0或更高版本,並且會比'LEFT JOIN'想法慢。我個人更喜歡'NOT IN'語法的語義,儘管它沒有性能,只要它不會顯着影響你的應用程序的響應時間。 – 2010-01-22 03:10:06

+1

MySQL 4.1也支持子查詢。 – 2010-01-22 03:23:36

+0

哦,謝謝比爾,現在你提到它就聽起來很熟悉。 – 2010-01-22 03:36:33