繁体   English   中英

SELECT DISTINCT 返回错误的结果

[英]SELECT DISTINCT return incorrect results

我正在尝试解决代码挑战:

提供具有一个或多个域的不同活动站点的列表(站点 ID、站点名称),
并且其域名都被删除。

我做的查询是:

select 
s.id as 'site id',
s.name as 'site name'
from sites s
inner join companies c on c.id = s.company
where c.is_on_hold != 1
and c.is_deleted != 1
and s.is_deleted != 1
and s.id in (select site from domains where is_deleted = 1)


这给了我 9 个结果,有人告诉我它只输出 6 个结果,谁能解释为什么?


数据库小提琴链接

您的问题是您获得的所有站点都至少删除了一个域,而您希望删除所有域。

将查询的最后一部分更改为:

and s.id not in (select site from domains where is_deleted = 0)

您要求的最后一部分是:

......而其域名被全部删除

所以我猜最后一个条件而不是:

and s.id in (select site from domains where is_deleted = 1)

应该:

and s.id in (
  select site 
  from domains 
  group by site
  having min(is_deleted) = 1
)

此子查询返回最小is_deleted1所有站点,这意味着没有is_deleted = 0 ,因此所有站点都被删除。
请参阅演示
结果:

| site id | site name  |
| ------- | ---------- |
| 31      | Wisconsin  |
| 53      | Washington |
| 62      | Wyoming    |
| 83      | Nevada     |
| 87      | Florida    |
| 96      | Indiana    |

我拿了你的代码并在最后添加了一个子查询。 我总共有6行。

我的做法是:假设is_deleted是整数类型或者兼容,那么就可以求和了。 因此,如果您按站点对域进行分组,并且sum(is_deleted)等于每个站点的记录数(计数),则意味着该站点的所有域都被删除 如果您将子选择作为独立查询运行,应该会变得清晰。 希望这是您正在寻找的结果。

SELECT 
s.id as 'site id',
s.name as 'site name'
FROM sites s
INNER join companies c ON c.id = s.company
WHERE c.is_on_hold != 1
AND c.is_deleted != 1
AND s.is_deleted != 1
AND s.id IN (
    SELECT site /*, sum(is_deleted), count(*) */
    FROM domains
    GROUP BY site
    HAVING SUM(is_deleted) = COUNT(*)
    ORDER BY site
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM