MySQL查询连接3个表,同时查找不匹配

时间:2012-08-22 23:27:55

标签: mysql sql join

(我无法想出一个简洁的标题)

Hello All

我一直是该网站的长期观看者,但在遇到问题后我无法解决,我以为我会报名参加提问。我不确定如何说出这个问题,这使得寻求帮助变得困难,而且很可能已经得到了解答,而我根本不知道正确的搜索条件来找到答案。也可能是因为我想要做的事情没有答案。如果我没有使用正确的程序要求,请道歉。

我想通过脚本轻松完成我想要实现的目标,而这可能是实现这一目标的唯一合适方式。我的情况让我陷入一种情况,我被问到是否可以通过MySQL查询来做到这一点。

ISSUE:

这是情况的本质(我不知道如何轻松地总结成一个主题)。我在mySQL数据库中有3个表:

Table: account
column: number (unique id)

Table: user
column: number (unique id)
column: account (links the user to an account)

Table: service
column: number (unique id)
column: user  (links the service to a user)
column: servdef (the type of service)

基本上,一个帐户拥有多个用户,每个用户可以拥有多个服务。

我被要求编写一个查询,该查询将显示包含特定类型的服务(service.number)的所有帐户(account.number)(service.servdef)。我在这个网站上看过关于使用NOT EXISTS的帖子,但是我无法让它在我的情况下正常工作。使用单个SQL查询甚至可以实现这一点吗?谢谢你的帮助!

5 个答案:

答案 0 :(得分:3)

使用LEFT JOIN,因为某些users在表service上没有记录。尝试,

SELECT  a.*
FROM    account a
            LEFT JOIN `user` b
                on a.number = b.account
            LEFT JOIN service c
                ON b.number = c.`user`
WHERE   c.`user` IS NULL OR
        c.servdef <> 'particularService'

SQLFiddle Demo

答案 1 :(得分:2)

使用NOT EXISTS

SELECT a.number
FROM account a
WHERE NOT EXISTS (
  SELECT u.account
  FROM user u INNER JOIN service s ON (u.number = s.user)
  WHERE u.account = a.number
    AND s.servdef = 'your_particular_type'
)

DEMO (sqlfiddle)。

答案 2 :(得分:0)

NOT IN通常是最慢的形式,但NOT EXISTS可能比LEFT JOIN更快,具体取决于您的引擎和索引。尝试每一个并看看。

SELECT a.number
FROM account a
WHERE a.number NOT IN (
  SELECT u.account
    FROM user u
    INNER JOIN service s ON u.number = s.user
    WHERE s.servdef = 'your_particular_type'
)

编辑: NOT IN的错误推理,抱歉。虽然我发现它比NOT EXISTS稍微容易阅读,但它对于可空列无效,但我不认为这适用于此。

答案 3 :(得分:0)

以下是我昨天看到的另一篇文章中对已接受答案的改编。

@servdef是您要查找的帐户不存在的服务类型。

select a.number
from account a 
  inner join user u on a.number = u.account
  inner join service s on u.number = s.user
group by a.number
having max(case when s.servdef = @servdef then 1 else 0 end) = 0

(戈登,如果你读到这个,请随意笑)

答案 4 :(得分:0)

问题原来是MySQL版本太旧而无法支持子查询。一台服务器升级到新硬件和现代操作系统,问题得到了解决。其他答案在技术上是正确的,但只适用于现代版本的MySQL。在问题的时候我不知道MySQL的版本是一个因素。我不是我想要检查的东西。