2012-09-28 4 views
0
을 만족하는

가능한 중복 : 나는 Users 테이블이
How to select rows where multiple joined table values meet selection criteria?얻기 테이블 행

, 각 사용자에 대한 몇 가지 옵션을 포함하는 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

한 덕분에, 나는에서 답을 찾았 [이 스레드 (http://stackoverflow.com/q/4047314/1488067) 그동안. – Lou

+0

@Dilbert 환영합니다 : D –

+0

사용자가 o.flag = 2와 o.flag = 1에 대해 두 항목을 갖고있는 경우이 쿼리는 레코드를 잘못 반환합니다. 그래서'COUNT (*)'가 아니라'HAVING COUNT (DISTINCT FLAG) = 2'가 필요합니다. –

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