2017-10-09 57 views
0

我有一個名爲'groups'的表和一個名爲'subscriptions'的另一個表。我想返回用戶沒有訂閱的所有組。查詢不在mysql中

基本上這就是我要否定條件(假設爲ID = 1的用戶,狀態只是如果組被激活校驗或不):

SELECT * 
    FROM groups g 
    LEFT 
    JOIN subscriptions s 
    ON s.groups = g.id 
WHERE g.status = 1 
    AND s.user = 1 

此查詢選擇所有的組用戶訂閱的地方,但我需要那些他沒有訂閱的地方。我的問題是,當他沒有訂閱時,沒有與該用戶相關的表格,所以如果我使用類似於!=的東西,它會返回一些我不需要的東西。

我以爲使用NOT IN或NOT EXISTS,但我無法讓它工作。

你們有快速和高性能的解決方案嗎? 非常感謝您

+0

記錄添加一些示例表數據和預期的結果 - 作爲格式化文本(而不是圖像) – jarlh

回答

1

更多的條件對表到ON條款:

SELECT * 
FROM `groups` G LEFT JOIN 
    `subscriptions` S 
    ON G.id = S.groups AND S.user = 1 
WHERE G.status = '1'; 

我猜測user確實是一個數字,這就是爲什麼我刪除了引號。無論如何,只能使用字符串和日期常量的引號,而不是數字。

+1

感謝您的提示,我仍然得到所有結果(所以也是用戶訂閱的結果),但現在我可以看到在他沒有進入的那些結果中有一個NULL值,所以我可以添加到我的情況一些就像S.user IS NULL – Ame

+1

@Ame:和瞧,現在你有*反連接的模式* ... LEFT JOIN找到匹配的行,然後WHERE子句中的條件排除了行一個匹配,只留下* *不匹配的行。 – spencer7593

-1

可以使用INNER JOIN代替LEFT JOIN得到已與其他記錄

SELECT * FROM `groups` AS G INNER JOIN `subscriptions` AS S ON G.id = S.groups WHERE G.status = '1' AND S.user = '1' 
0

使用此查詢

SELECT * FROM groups g where g.ID not in(select groups from subscriptions)