2012-09-28 63 views
0

可能重複:
How to select rows where multiple joined table values meet selection criteria?在多個外部表的標準需要獲取表中的行要滿足

我有一個Users表,其中包含了一些選項,爲每個用戶Optons表。每個用戶可以選擇多個選項。

這是表什麼樣子:

-- this is where user names are stored 
create table Users 
(
    ID int, 
    UserName varchar(255) 
) 

-- this table contains options 
-- (one flag per row) 
create table Options 
(
    ID NOT NULL AUTO_INCREMENT int, 
    Flag int, 
    User_ID int // foreign key 
) 

我想獲得具有設置兩個某些選項的所有用戶,但只有當他們兩個設置。

例如,這將返回其中任何選項設置用戶:

-- find all users with flags 1 and 2 set 
select u.UserName from Users u 
    inner join Options o on o.User_ID = u.ID 
    where o.Flag in (1, 2) 

我怎樣才能使它返回其有兩個條目(標記1和2)Options表中的所有用戶?

回答

1

您的查詢幾乎是正確的,但您需要計算記錄的數量實例,並且應該等於您的where子句中的參數數量。

SELECT u.UserName 
FROM Users u 
    INNER JOIN Options o 
     ON o.User_ID = u.ID 
WHERE o.Flag in (1, 2) 
GROUP BY u.UserName 
HAVING COUNT(o.Flag) = 2 
+1

+1謝謝,我發現在回答[此線索](http://stackoverflow.com/q/4047314/1488067)同時。 – Lou

+0

@Dilbert不用客氣:D –

+0

如果用戶有兩個o.flag = 2的條目,而o.flag = 1則沒有這個查詢,這個查詢會錯誤地返回記錄。這就是爲什麼你需要'有計數(DISTINCT FLAG)= 2'而不是'COUNT(*)' –

1

只是把它扔在那裏:

SELECT DISTINCT u.UserName 
FROM Users u 
JOIN Options o ON u.User_ID = o.ID AND o.Flag=1 
JOIN Options p ON u.User_ID = p.ID AND p.Flag=2 
相關問題