2017-10-09 58 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)