2014-06-08 6 views
0

실제로 세 개의 테이블이 있습니다. 범주, 사용자 및 사용자 범주입니다. 사용자가 볼 수 있듯이 m-n userCategories 테이블을 통해 여러 범주에 사용자를 할당 할 수 있습니다.SQL UNION 쿼리 단순화

특정 사용자에 대한 모든 카테고리를 선택하고 싶습니다. 카테고리가 지정된 사용자에게 할당되면 userFk-column은 userId (예 : 5) 여야하며, 그렇지 않으면 NULL이어야합니다.

이 쿼리와 비슷한 결과가 나타납니다. 그러나이 쿼리를 단순화하는 방법이 있습니까?

select * 
from (
    SELECT `categoryId`, `category`, userFk FROM `category` c 
    left join usercategories uc on c.categoryId = uc.catFk 
    where userFk = 5 
union 
    SELECT `categoryId`, `category`, userFk FROM `category` c 
    left join usercategories uc on c.categoryId = uc.catFk 
    where userFk != 5 OR userFk is NULL 
) as result 
group by categoryId 
+0

음 .. 예를 들어 범주가 사용자 2와 5에 할당되고 categoryId별로 그룹을 말하면 사용자 5에게 할당 된 행이 손실 될 수 있습니다. 무슨 뜻인지 이해합니까? –

답변

2

왼쪽에있는 사용자 ID를 넣어 절에 가입하는 경우, 그것은 당신에게 노조

SELECT `categoryId`, `category`, userFk 
FROM `category` c 
LEFT JOIN usercategories uc on c.categoryId = uc.catFk AND userFk = 5 

그 방법을 절약 할 수, 쿼리의 유일하게 가능한 결과는 따라서 당신을 절약 userFK=5 또는 NULL 것 WHERE 절도.

사용자가 가지고 있지 않은 카테고리는 userFK = NULL 튜플에만 한 번 표시 될 수 있으므로 반복하지 않는 한 group by은 필요하지 않습니다. 당신이 사용자의 범주를 원하는 경우

+0

완벽한 .. 그게 내가 원하는 .. 대단히 감사합니다. –

0

당신이 사용할 수 있습니다

SELECT `categoryId`, `category`, userFk FROM `category` c 
left join usercategories uc on c.categoryId = uc.catFk 
where userFk = 5 

나는 userCategories에는 null 값을했다 생각하지 범주없는 사용자는 userCategories 테이블에 있으면 안됩니다.

0

하위 쿼리에서 유니온의 두 부분은 where 절에서 동일합니다. 서브 쿼리의 모든 기록은 이렇게

SELECT `categoryId`, `category`, userFk FROM `category` c 
left join usercategories uc on c.categoryId = uc.catFk 
where userFk = 5 
union 
SELECT `categoryId`, `category`, userFk FROM `category` c 
left join usercategories uc on c.categoryId = uc.catFk 
where userFk != 5 OR userFk is NULL 

해당 단지

SELECT `categoryId`, `category`, userFk FROM `category` c 
left join usercategories uc on c.categoryId = uc.catFk 

내가 아무것도 실종하지 않는 것입니다, 두 조건 중 하나에 빠질 것인가?

+0

예. 나는 두려워 .. 그게 중복 결과를 표시합니다 .. 만약 당신이 내 응용 프로그램에서 사용자를 선택, 체크 표시와 X - 크로스, 할당을 나타내는 범주를 표시 싶었어요. –