(我无法想出一个简洁的标题)
Hello All
我一直是该网站的长期观看者,但在遇到问题后我无法解决,我以为我会报名参加提问。我不确定如何说出这个问题,这使得寻求帮助变得困难,而且很可能已经得到了解答,而我根本不知道正确的搜索条件来找到答案。也可能是因为我想要做的事情没有答案。如果我没有使用正确的程序要求,请道歉。
我想通过脚本轻松完成我想要实现的目标,而这可能是实现这一目标的唯一合适方式。我的情况让我陷入一种情况,我被问到是否可以通过MySQL查询来做到这一点。
这是情况的本质(我不知道如何轻松地总结成一个主题)。我在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查询甚至可以实现这一点吗?谢谢你的帮助!
答案 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'
答案 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的版本是一个因素。我不是我想要检查的东西。