簡體   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