2009-07-20 106 views
5

以擁有用戶的應用程序爲例,每個用戶可以只在一個組中。如果我們想要選擇沒有成員的組的列表,什麼是正確的SQL?我保持感覺就像我正要抓住查詢,然後它再次消失。選擇表中未出現在其他表的外鍵中的所有項目

獎勵積分 - 給出替代塞納里奧,它是一個多對多的配對,什麼是SQL來識別未使用的組?

(如果你想具體的字段名:) 一到多:

Table 'users': | user_id | group_id | 
Table 'groups': | group_id | 

許多一對多:

Table 'users': | user_id | 
Table 'groups': | group_id | 
Table 'user-group': | user_id | group_id | 
+0

謝謝你的兩個答案,他們都工作。我很好奇這兩種方法之間是否有功能差異。 – dimo414 2009-07-21 07:19:17

回答

4

組有沒有成員(爲多對多的配對):

SELECT * 
FROM groups g 
WHERE NOT EXISTS 
    (
     SELECT 1 
     FROM users_groups ug 
     WHERE g.groupid = ug.groupid 
    ); 

這個SQL也將在你的「第一次」的例子工作,你可以代替「用戶」爲「users_groups」在子查詢=)

至於表現而言,我知道,這個查詢可以在SQL Server上相當高性能的,但我不那麼肯定的MySql如何喜歡它..

2

對於第一個,試試這個:

SELECT * FROM groups 
LEFT JOIN users ON (groups.group_id=users.group_id) 
WHERE users.user_id IS NULL; 

對於第二個,試試這個:

SELECT * FROM groups 
LEFT JOIN user-group ON (groups.group_id=user-group.group_id) 
WHERE user-group.user_id IS NULL; 
1
SELECT * 
FROM groups 
WHERE groups.id NOT IN (
    SELECT user.group_id 
    FROM user 
) 

它會返回ñ所有組ID不存在於用戶

相關問題