2014-09-24 58 views
-1

我有一個SQL小提琴在這裏http://sqlfiddle.com/#!2/c6222/1需要一點幫助。需要包括一些結果從不IN

我需要返回任何group_id,其中有一個user_id,該group_id在該group_id內沒有'GROUP'設置。我在SQL小提琴中的查詢正在刪除13565,因爲它在不同的group_id中具有「GROUP」。

這很簡單,但我無法得到它。

CREATE table role(
    role_id int, 
    role_type varchar(255), 
    group_id int, 
    user_id int 
); 

INSERT INTO role VALUES(71002,'Group',1465,8301); 
INSERT INTO role VALUES(71000,'Training_admin',1465,7959); 
INSERT INTO role VALUES(71003,'Training_admin',1465,8301); 
INSERT INTO role VALUES(71001,'Training_User',1465,7959); 
INSERT INTO role VALUES(71004,'Training_User',1465,8301); 
INSERT INTO role VALUES(71005,'Training_User',1465,13541); 
INSERT INTO role VALUES(493513,'Initial',6314,13565); 
INSERT INTO role VALUES(493522,'Ongoing',6314,13565); 
INSERT INTO role VALUES(493534,'Initial',3128,13565); 
INSERT INTO role VALUES(493556,'Group',3128,13565); 

select * from role 
where user_id not in (select role.user_id 
    from role 
    where role.role_type = 'GROUP') 
+1

你應該在這裏包括你的代碼在你的問題 – niyou 2014-09-24 11:46:32

+0

@GordonLinoff - 在這裏你去... :) – DrDan 2014-09-24 11:46:41

+0

你沒有問過這個問題嗎? – 2014-09-24 11:49:42

回答

0

使用NOT EXISTS代替NOT IN,這允許多個謂詞:

SELECT * 
FROM Role AS r 
WHERE NOT EXISTS 
     ( SELECT 1 
      FROM role AS r2 
      WHERE r2.user_id = r.user_id 
      AND  r2.group_id = r.group_id 
      AND  r2.role_type = 'GROUP' 
     ); 

話雖這麼說,MySQL performs better using LEFT JOIN/IS NULL over NOT EXISTS,所以你應該爲改寫:

SELECT r.* 
FROM Role AS r 
     LEFT JOIN role AS r2 
      ON r2.user_id = r.user_id 
      AND r2.group_id = r.group_id 
      AND r2.role_type = 'GROUP' 
WHERE r2.role_id IS NULL; 
+0

謝謝! 「SELECT 1」對我來說是新的,我認爲這就是爲什麼我總是嘗試使用NOT IN, – DrDan 2014-09-24 11:56:03

+0

@DDDan即使「SELECT 1」對您而言是新手,也可以在沒有子查詢的情況下繼續使用第二種解決方案。儘可能地避免在SQL查詢中使用子查詢是一種很好的做法 – 2014-09-24 13:46:19

0

下面是該查詢你正在尋找沒有子查詢(爲了更好的性能):

SELECT * 
FROM role R 
LEFT OUTER JOIN role R2 ON R2.user_id = R.user_id 
          AND R2.role_type = 'GROUP' 
WHERE R2.user_id IS NULL 

希望這會對你有所幫助。