[英]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.