2014-09-22 89 views
2

我有一個非常簡單的查詢,「我想要所有沒有role_type爲'GROUP'的user_id。下面的sqlfiddle給出了我想要的http://sqlfiddle.com/#!2/0a9640/1的正確結果,但是當我運行查詢在我的實際MySQL數據庫也不會返回2個結果與USER_ID = 13565和我不知道爲什麼。NOT IN缺少結果

子查詢給出了統一的答案8301的確,如果我手動輸入該數值到 括號,即

select * from role 
where role.user_id not in (
    select role.user_id 
    from role 
    where role.role_type = 'GROUP' 
) 
and (group_id=1465 or group_id=6314) 
order by user_id 

然後,2失蹤的結果以某種方式重新出現任何想法爲什麼這些結果被剝離當我使用子查詢w ith不在?

+0

是'那些行group_id'空? – Ben 2014-09-22 10:02:00

+1

不要向我們顯示它的工作數據,但它不起作用的數據。 – fancyPants 2014-09-22 10:05:36

+0

@Ben,這些行的group_id不爲NULL,數據與SQLfiddle中的數據完全相同(它缺少一個role_id列,但它也不爲NULL) – DrDan 2014-09-22 11:08:05

回答

1

not in的已知混淆是,如果子查詢返回任何元素的子查詢返回NULL,則會將所有行過濾掉。這可以通過固定檢查此明確:

select r.* 
from role r 
where r.user_id not in (select r2.user_id 
         from role r2 
         where r2.role_type = 'GROUP' and r2.user_id is not null 
         ) and 
     r.group_id in (1465, 6314) 
order by r.user_id; 

我更喜歡使用not exists,因爲它沒有這個問題與NULL S:

select r.* 
from role r 
where not exists (select r2.user_id 
        from role r2 
        where r2.role_type = 'GROUP' and r2.user_id = r.user_id 
       ) and 
     r.group_id in (1465, 6314) 
order by r.user_id; 

編輯:

我懷疑問題是用戶13565有role_type = 'GROUP',但是對於不同的group_id。也許這是你真正想要的查詢:

select r.* 
from role r 
where not exists (select 1 
        from role r2 
        where r2.role_type = 'GROUP' and r2.user_id = r.user_id and 
         r2.group_id in (1465, 6314) 
       ) and 
     r.group_id in (1465, 6314) 
order by r.user_id; 
+1

「*已知問題*」有點誇大其辭。這是通過SQL語言設計的。 – 2014-09-22 11:17:21

+0

它仍然錯過了最後2個結果。這只是行爲不正確。如果我在SQL小提琴上運行該查詢,那麼我會得到5個結果,如果我在我的數據庫上運行,那麼我只得到3!如果我手動將8301放入sebquery中,那麼我會得到5. – DrDan 2014-09-22 11:19:05

+0

@DDDan。 。 。我的猜測是你的數據庫中有一些意想不到的數據。也許'GROUP'被誤稱或其他不同。 – 2014-09-22 11:22:28

0

當我們考慮性能時,使用子查詢不是最好的方法。

這裏是詢問你正在尋找,不使用子查詢

SELECT R.* 
FROM role R 
LEFT OUTER JOIN role R2 ON R2.user_id = R.user_id 
         AND R2.role_type = 'GROUP' 
WHERE R.group_id IN (1465, 6314) 
    AND R2.user_id IS NULL 
ORDER BY R.user_id 

希望這將幫助你

+0

在SQL小提琴中給出了2個結果,而不是我需要的5個結果。在我的數據庫中,它再次給出0,因爲group_id = 6314的結果只是因爲某些原因而沒有返回,除非我在子查詢中手動輸入8301 – DrDan 2014-09-22 11:25:22

+0

我在幾秒鐘前修復了我的查詢,'IN'子句中有一個輸入錯誤(1456而不是1465)。 – 2014-09-22 11:27:01

+0

沒有看到這個錯字,感謝您的更改。儘管如此,我仍然沒有得到這2個結果。我只是不明白爲什麼,這應該是如此簡單! :) – DrDan 2014-09-22 11:48:52