2013-06-27 2 views
3

사용자 users_groups 및 grous 테이블 :는 MySQL의 : 내가 (여기에 질문 컬럼 만 중요) 3 개 테이블을 가지고있다

USERS    GROUPS     USERS_GROUPS 
id     id      user_id 
        importance    group_id 
        color     

당신이 볼 수 있듯이, 한 사용자가 여러 그룹에있을 수 있습니다, 각 그룹은 다른 가지고있다 어떤 그룹은 다른 그룹보다 중요합니다. 예를 들어 사용자 A는 그룹 편집기 (파란색) 및 중재자 (녹색)입니다. 그가 볼 수있는 색은 무엇입니까? 녹색은 편집기보다 중재자가 더 중요하기 때문입니다.

그러나 테이블 그룹에서 사용자의 색을 얻는 방법을 모르는 경우가 있습니다. 나는 그런 쿼리를 만들었습니다

SELECT * FROM `users` INNER JOIN users_groups ON users_groups.user_id = users.id INNER JOIN groups ON groups.id=users_groups.group_id 

을하지만 사용자가 그룹이 그것을 그런 식으로, 많은 사용자의 행을 반환 :

USERNAME (...) GROUP_ID  NAME (group)   COLOR  IMPORTANCE 
user    2    moderator   green  50 
user    3    editor    blue  25 
administrator  1    admin    orange  100 
administrator  3    editor    blue  25 

난 단지 가장 중요한 그룹을 좀하고 싶습니다 -의 구성원으로 관리자에게 그룹 운영자 그룹 및 사용자를 그룹 운영자로 참여시킵니다.

답변

1

옵션 1 : 이 하나가 각 사용자의 가장 중요한 그룹을 가져온 다음 해당 그룹의 색상을 찾기 위해 다시 groups 테이블에 간다. 초기 GROUP BY가 반드시 MAX (중요도) 결과에 해당하는 올바른 색상을 차지하지 않기 때문에 추가 JOIN이 필요합니다.

SELECT T1.*, groups.color FROM 
(
    SELECT users.id, MAX(groups.importance) AS most_important_group FROM `users` 
    INNER JOIN 
    users_groups 
    ON users_groups.user_id = users.id 
    INNER JOIN groups 
    ON groups.id=users_groups.group_id 
    GROUP BY users.id 
) AS T1 
INNER JOIN 
groups 
ON T1.most_important_group=groups.importance 
GROUP BY T1.id 

옵션 2 : 이 옵션 주문 해당 행에서 해당 색상으로 상단에 각 사용자의 가장 중요한 그룹을 함께 지참해야하는 방식으로 설정 초기 결과. 외부 GROUP BY 뒤에 원하는 정보가 들어있는 각 사용자에 대해 한 행만 표시되어야합니다. 하위 쿼리에서 반환 할 필드를 사용자 정의 할 수 있습니다. 나는 가능한 한 많이 포함 시켰지만, 필요가 없다면 이것을 줄여야합니다 (적은 필드는 더 빠른 결과를 의미해야합니다).

SELECT * FROM 
(
    SELECT users.*, users_groups.*, groups.importance, groups.color FROM `users` 
    INNER JOIN users_groups 
    ON users_groups.user_id = users.id 
    INNER JOIN groups 
    ON groups.id=users_groups.group_id 
    ORDER BY users.id, groups.importance DESC 
) AS T1 
GROUP BY T1.id 

이들의 성능은 테이블 크기 및 색인 구조에 따라 달라질 수 있습니다. 둘 다 시도해보고 어느 것이 더 빠른 지 응답하십시오. 더 빠른 실행 시간이 필요하면이 쿼리의 일부 EXPLAIN 문과 테이블에 대한 DESCRIBE 문으로 자유롭게 응답하십시오.

1

이것은 여러 가지 해결책이있는 mysql에서 흔히 발생하는 문제입니다. 일반적으로 가장 빠른 것은 결과 필터링에 가장 중요한 항목을 선택하는 하위 쿼리에 참여하는 것입니다.

SELECT users.*, groups.* 
FROM `users` 
INNER JOIN users_groups 
ON users_groups.user_id = users.id 
INNER JOIN groups 
ON groups.id=users_groups.group_id 
INNER JOIN (SELECT user_groups.user_id, MAX(importance) AS importance FROM groups GROUP BY user_id) mxGrp 
ON (groups.user_id = mxGrp.user_id AND groups.importance = mxGrp.importance); 

다른 가능한 해결책에 대한 설명은 this blog post을 참조하십시오.

+0

링크를 가져 주셔서 감사합니다. – Andy