选择未分配给组的所有行(在另一个表中)

时间:2014-02-17 14:02:34

标签: mysql sql

信息

我有两张桌子。 accounts& accounts_groups_assigned

accounts包含所有帐户信息,accounts_groups_assigned包含已分配给组的帐户的ID。主要结构不是什么独特的。只是基本的ID列和名称等,如果真的需要我会将它添加到帖子中,但如前所述,它非常通用。

问题

我需要能够从accounts中选择尚未分配给某个群组的所有帐户。现在这在PHP中相当容易,但我希望能够使用MySQL进行一次查询。

根据要求,表格结构。

accounts

ID | Name

accounts_groups_assigned

ID | Group_id | account_id

3 个答案:

答案 0 :(得分:1)

这样的东西?

SELECT * FROM accounts a
   LEFT JOIN accounts_groups_assigned aga ON a.ID = aga.account_id
WHERE aga.account_id IS NULL

此处LEFT JOIN将两个表链接在一起,确保显示accounts的所有记录,即使它们在accounts_groups_assigned表中没有匹配的行也是如此。如果不匹配,account_id中的accounts_groups_assigned将为NULL

然后,我们可以使用WHERE aga.accounts_groups_assigned IS NULL查找account_id尚未与group_id相关联的所有情况。

答案 1 :(得分:0)

怎么样?

SELECT 
    * 
FROM 
    accounts 
LEFT JOIN accounts_groups_assigned groups ON accounts.id = groups.account_id 
WHERE 
    groups.account_id IS NULL;

LEFT JOIN在匹配的id字段上链接表格。 WHERE子句通过选择未分配accounts ...的所有accounts_groups_assigned,为您提供所需的结果。有关JOINS的详细说明,请参阅this文章。

答案 2 :(得分:0)

我喜欢使用NOT IN来排除来自另一个表的数据,因为它比LEFT JOIN和检查NULL更清楚实际发生的事情。

SELECT 
    columns
FROM 
    accounts a
WHERE 
    a.id NOT IN (
    SELECT 
        account_id
    FROM 
        accounts_groups_assigned
)