[英]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_deleted
为1
所有站点,这意味着没有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.