2

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

大家好

我一直是该网站的长期浏览者,但在遇到无法解决的问题后,我想我会注册问一个问题。我不知道如何表达这个问题,这使得寻找帮助变得困难,很可能这个问题已经得到解答,我只是不知道找到答案的正确搜索条件。也可能是我正在尝试做的事情没有答案。抱歉,如果我没有使用正确的程序来询问。

我想要实现的目标可以通过脚本轻松实现,这可能是唯一合适的方法。我的情况使我处于被问到是否只能通过 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.servdef)的服务(service.number)的所有帐户(account.number)。我在这个网站上看到过关于使用 NOT EXISTS 的帖子,但我无法让它在我的情况下正常工作。这甚至可以通过单个 SQL 查询实现吗?谢谢你的帮助!

4

5 回答 5

3

使用LEFT JOIN它,因为有些users在 table 上没有记录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 演示

于 2012-08-22T23:49:50.797 回答
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'
)

演示(sqlfiddle)。

于 2012-08-22T23:52:07.473 回答
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,但我认为这不适用于可空列。

于 2012-08-22T23:54:17.133 回答
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

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

于 2012-08-23T00:03:15.257 回答
0

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

于 2017-12-28T17:15:53.290 回答