2010-06-15 3 views
0

이것이 현재 쿼리입니다. 필요한 결과를 얻지 못했습니다. 나는 그들이 "자원"을 표시하지 않는 경우에도 그들이 연결을 갖고 싶지 않아.3 개의 테이블 조인 - 조인 방법 수행

SELECT * 
FROM (`user_permissions`) 
JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role` 
JOIN `user_resources` ON `user_resources`.`id` = `user_permissions`.`resource` 
WHERE `role` = '4' 

왼쪽 또는 오른쪽 조인을 시도해도 여전히 동일한 결과가 반환됩니다. 내가 얻을 결과는 다음과 같습니다

id | role | resource | name 

5 | 4  |  2 | Changelog 

내가

id | role | resource | name 

5 | 4 | 2 | Changelog 
null | null | null | Resource2 
null | null | null | Resource3 

이게 가능하려면?

답변

3

roleuser_permissions의 일부이며, 존재하지 않을 수도 있고 존재하지 않을 수도있는 연결 중 하나입니다. 이러한 null 레코드를 표시하려는 경우 where 절을 WHERE `role`= '4' OR `role` IS NULL으로 변경하는 것을 고려하십시오.

또한 오른쪽 조인으로 수행 할 수도 있지만 user_resources에서 선택하면 더 읽기 쉽거나 이해할 수 있습니다. 그런 다음 다른 테이블에 조인을 남겼습니다. 이것은 귀하의 문제점 설명문에서옵니다. 당신은 "연결이없는 경우에도 모든 '자원'을 표시하기를 원합니다. 이는 자원에서 선택하고 연결이있을 경우 연결을 원한다는 것을 의미합니다. 당신의 SQL에서

2

당신은

WHERE `role` = '4' 

요청하고 role에서 null이있는 결과를 원하는? null4이 아니므로 그러한 결과는 없습니다.

1

첫 번째 : where 절은 항상 결과 집합을 제한합니다. 역할에 "4"가 필요한 조건이 있으므로 결과에 역할 열에 "4"가 표시되지 않으면 결과가 표시되지 않습니다.

두 번째 : 두 번째 : "name"은 어디에서 왔는가 - 표시 할 항목이므로이 열을 기본 테이블로두고 다른 두 테이블을 LEFT JOIN해야합니다.

가정 "이름이"자원에서오고, 쿼리 읽어야합니다 (user_permissions) FROM

SELECT * 
FROM `user_resources` 
LEFT JOIN `user_permissions` ON `user_permissions`.`resource` = `user_resources`.`id` 
LEFT JOIN `user_groups` ON `user_groups`.`id` = `user_permissions`.`role` 
1

SELECT * 이 user_groups ON user_groups 가입하세요. id = user_permissions. role JOIN user_resources ON user_resources. id = user_permissions. resource

은이 쿼리에서 결과를 얻을 것이다 (role =의 '4'또는 role가 null)