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

Mysql 选择未分配给组的所有行(在另一个表中),mysql,sql,Mysql,Sql,信息 我有两张桌子科目和科目组分配 accounts包含所有帐户信息,并且accounts\u groups\u assigned包含已分配给组的帐户ID。主体结构没有什么独特之处。只是基本的ID列和名称等,如果真的需要,我会把它添加到文章中,但正如前面提到的,它非常通用 问题 我需要能够从账户中选择尚未分配到组的所有账户。现在这在PHP中是相当容易做到的,但我希望能够通过使用MySQL的一个查询来做到这一点 根据要求,提供表格结构 账户 ID| Name 及 分配的科目组 ID |组ID |帐

信息

我有两张桌子<代码>科目和
科目组分配

accounts
包含所有帐户信息,并且
accounts\u groups\u assigned
包含已分配给组的帐户ID。主体结构没有什么独特之处。只是基本的ID列和名称等,如果真的需要,我会把它添加到文章中,但正如前面提到的,它非常通用

问题

我需要能够从
账户
中选择尚未分配到组的所有账户。现在这在PHP中是相当容易做到的,但我希望能够通过使用MySQL的一个查询来做到这一点

根据要求,提供表格结构

账户

ID| Name

分配的科目组

ID |组ID |帐户ID

类似的东西

SELECT * FROM accounts a
   LEFT JOIN accounts_groups_assigned aga ON a.ID = aga.account_id
WHERE aga.account_id IS NULL
此处的
LEFT JOIN
将两个表链接在一起,确保将显示
账户
中的所有记录,即使它们在分配的
账户组
表中没有匹配的行。如果不匹配,分配给
账户组的
账户id
将为
NULL

然后,我们可以使用
其中aga.accounts\u groups\u assigned为NULL
来查找
帐户id
尚未链接到
组id
的所有情况,这是怎么回事

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
子句通过选择所有未分配
帐户组的
帐户
,为您提供所需的结果。有关
联接的详细说明,请参阅文章

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

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

@FreshPrinceOfSO我甚至不知道从哪里开始检查查询中的另一个表,我已经尝试研究了左连接和子查询,但是我不确定我应该从子查询中得到什么,这对初始查询有用。最后,感谢您对我可以回复的内容进行编辑。至少,我们需要查看表结构。使用表结构进行更新,希望对您有所帮助。这非常有效!谢谢你努力解决这个问题,而不是为了免费的编辑点而挑剔我的问题。我希望这也能奏效!谢谢您的时间。这也很有效,但是
联接
通常比子查询快。最好的方法是使用
Show Execution Plan
运行这两个程序并进行比较。但子查询的速度很少更快。