2011-02-14 29 views
2

我有很多的用戶和組之間的多對多關係:查詢不在特定組中的用戶? (本來是想區別在於使用,但它似乎MySQL不支持它)

CREATE TABLE IF NOT EXISTS `SecurityIdentifiers` (
    `Guid` char(36) NOT NULL, 
    PRIMARY KEY (`Guid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `CaseIdUsers` (
    `Sid` char(36) NOT NULL, 
    `Acl` int(11) NOT NULL, 
    `FirstName` varchar(45) NOT NULL, 
    `LastName` varchar(45) NOT NULL, 
    `CaseID` varchar(8) NOT NULL, 
    PRIMARY KEY (`Sid`), 
    UNIQUE KEY `CaseID_UNIQUE` (`CaseID`), 
    KEY `fk_CaseIDUsers_AccessControlLists1` (`Acl`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `GroupMembers` (
    `User` char(36) NOT NULL, 
    `Group` char(36) NOT NULL, 
    PRIMARY KEY (`User`,`Group`), 
    KEY `fk_Groups_has_SecurityIdentifiers_SecurityIdentifiers1` (`User`), 
    KEY `fk_Groups_has_SecurityIdentifiers_Groups1` (`Group`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE IF NOT EXISTS `Groups` (
    `Sid` char(36) NOT NULL, 
    `Acl` int(11) NOT NULL, 
    `Name` varchar(45) NOT NULL, 
    `Description` varchar(255) NOT NULL, 
    PRIMARY KEY (`Sid`), 
    UNIQUE KEY `Name_UNIQUE` (`Name`), 
    KEY `fk_Groups_Access Control Lists1` (`Acl`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

我需要找到所有誰在一個特定的不是用戶組。我想做類似的事情:

SELECT CaseId FROM CaseIdUsers 
EXCEPT 
SELECT CaseId FROM CaseIdUsers 
JOIN GroupMembers ON GroupMembers.User = CaseIdUsers.Sid 
JOIN Groups ON GroupMembers.Group = Groups.Sid 
WHERE Groups.Name = 'MyGroupName' 

但是MySQL不支持EXCEPT。現在我該怎麼做?

回答

3

可以使用NOT IN(),或<> ANY()

SELECT CaseId 
FROM CaseIdUsers 
WHERE CaseID NOT IN (
    SELECT CaseId 
    FROM CaseIdUsers 
    JOIN GroupMembers ON GroupMembers.User = CaseIdUsers.Sid 
    JOIN Groups ON GroupMembers.Group = Groups.Sid 
    WHERE Groups.Name = 'MyGroupName' 
) 

或者,你可以使用一個LEFT JOINGROUP BY

SELECT CaseId 
FROM CaseIdUsers 
    LEFT JOIN GroupMembers ON GroupMembers.User = CaseIdUsers.Sid 
    LEFT JOIN Groups ON GroupMembers.Group = Groups.Sid 
    AND Groups.Name = 'MyGroupName' 
HAVING COUNT(Groups.Sid) = 0 
+0

第一個查詢不起作用。它返回組MyGroupName中的用戶,如果他們恰好位於另一個組中。 – 2011-02-14 20:58:17

相關問題