2014-02-17 47 views
-1

信息选择未分配到组(另一个表)中的所有行

我有两个表。 accounts & accounts_groups_assigned

accounts拥有所有帐户信息,并accounts_groups_assigned包含已分配到组帐户的标识。主要结构没有任何独特之处。只是基本的ID列和名称等,如果真的需要我会将它添加到帖子中,但正如前面提到的,它非常通用。

问题

我需要能够选择所有从accounts还没有被分配到一组尚未决算。现在,这在PHP中很容易实现,但我希望能够使用MySQL进行一次查询。

根据要求,表结构。

accounts

ID | Name

而且

accounts_groups_assigned

ID | Group_id | account_id

+0

@FreshPrinceOfSO我不知道在哪里,即使检查查询内的另一个表开始,我曾尝试研究左联接和子查询的,但我对我的目标应该是从子回来不确定 - 这对于初始查询很有用。最后,感谢您将您的评论修改为我实际可以回复的内容。 – Harry

+0

至少,我们需要查看表结构。 – Kermit

+0

更新与表结构,希望他们帮助。 – Harry

回答

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表中没有匹配的行。在不匹配的情况下,accounts_groups_assigned中的account_id将是NULL

然后,我们可以使用WHERE aga.accounts_groups_assigned IS NULL来查找account_id尚未链接到group_id的所有情况。

+0

完美的作品!感谢您为解决这个问题而努力,而不是在免费的编辑点挑选我的问题。 – Harry

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文章。

+0

我希望这也能工作!感谢您的时间。 – Harry

0

我喜欢使用NOT IN从另一个表中排除数据,因为它比实现LEFT JOIN和检查NULL更清晰。

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

这也适用,但'JOINS'通常比子查询快。最好的方法是使用'Show Execution Plan'运行并比较。但是子查询速度更快的情况很少见。 – hanleyhansen

相关问题