2012-07-10 6 views
0

저는 현재 MySQL의 문제에 대한 답을 생각하고 있습니다. 제발 도와주세요, 당신은 나의 유일한 희망입니다!MySQL 쿼리 2 개의 관계 테이블이있는 2 개의 테이블을 결합하십시오.

기본 사항을 철저히 분석하면 "사람"과 "활동"이라는 두 개의 테이블이 있습니다. 이 두 테이블이 두 개의 다른 관계 테이블에 의해 조인 될 수 있습니다 (긴 이야기와 많은 데이터가 포함됨). people_activity 및 entity_activity 활동 레코드에 연결된 사람들 레코드를 가져 오는 활동 테이블에 대한 쿼리를 수행해야합니다. 두 관계 테이블을 기반으로합니다.

내가 무슨이지만, 많은 데이터에 다량으로 느리다 :

select * from activity 
left join peopleactivity on peopleactivity.activityid = activity.activityid 
left join entityactivity on entityactivity.activityid = activity.activityid 
left join people on (peopleactivity.peopleid = people.peopleid OR 
        entityactivity.entityid = people.peopleid) 

좀 더 노트 - 나는 또한이 개 관계 테이블의 결과를 결합하는 뷰를 작성하는 대신 가입 시도 이보기를 통해 사람들과 활동을 이것은 또한 작동하지만 여전히 또한 내가이 -like 노동 조합을 시도 주요 두통

는 관계/s의 작업이 하나 개의 테이블에 consolodate하는 방법입니다 변경

대규모 느리다 -

select * from activity 
left join peopleactivity on peopleactivity.activityid = activity.activityid 
left join people on (peopleactivity.peopleid = people.peopleid) 
union 
select * from activity 
left join peopleactivity on peopleactivity.activityid = activity.activityid 
left join people on (entityactivity.entityid= people.peopleid) 

도 작동하지만 다른 이유로 인해 문제가 발생합니다. 너무 많은 기본을 변경하지 않고 하나의 쿼리에서이 작업을 수행해야합니다.

누구나 내가 놓친 놀라운 아이디어가 아주 많습니까?

2)를 사용하여 내부 조인 대신 왼쪽 조인의

+0

두 번째 쿼리 (UNION)에서 두 개의 동일한 쿼리를 UNION하는 것처럼 보입니다. 나는 그 중 하나가'peopleactivity' 테이블보다는'entityactivity' 테이블을 포함해야한다고 생각하고 있습니다. 또한 UNION ALL 연산자는 UNION 연산자보다 몇 가지 중요한 성능 이점을 가질 수 있습니다. – spencer7593

+0

각 개별 쿼리의 성능은 어떻습니까? 각자는 "매우 느린가"아니면 따로 따로 "blazingly fast"인가?각 쿼리 및 결합 된 쿼리에 대한 EXPLAIN은 사용되는 인덱스와 같은 질문에 응답합니다. 경우에 따라 두 가지 별도의 쿼리가 필요합니다. – spencer7593

답변

0

감사합니다. 나는 위의 다양한 화신을 시도했다. 내 대답은 새 테이블을 설정하고 기존의 모든 링크를 해당 테이블에 복사 한 다음 트리거를 사용하여 두 개의 개별 링크 테이블에서 링크가 제거 될 때마다 해당 테이블에 대한 링크를 추가/제거하는 것이 었습니다. 이것은 잘 작동하며,이 새로운 테이블에서 인덱스를 사용하여 멋지고 명랑하게 유지할 수 있습니다. 아이디어를 게시 할 시간이 많은 사람들에게 많은 감사를드립니다!

0

당신은 IN

left join people on people.peopleid IN (peopleactivity.peopleid, entityactivity.entityid) 
0

1) 각 테이블의 기본 키로 테이블의 ID를 설정하는 시도로 OR를 교체하려고 할 수 있습니다 . 왜 당신이 다른 테이블의 모든 결과를 얻었을 때 왼쪽 테이블 조인을 사용하는지 확신 할 수 없으며, 다른 테이블에 조인 값이 있는지 여부에 상관없이 기본적으로 모든 레코드를 가져옵니다. 이것도 도움이 될 것 같아요. 테이블에 대한 설명을 게시 할 수 있습니까?

0

나는 UNION 쿼리를 유지해야하지만 이들을 INNER 조인으로 만들어야한다고 생각합니다. LEFT 조인이 정말로 필요합니까?

또한 일부 성능 이득이되는, UNION ALL로 변경할 수 : 코멘트에 대한

SELECT activity.*, people.*, 'PA' AS joining_table 
    FROM activity 
    JOIN peopleactivity ON peopleactivity.activityid = activity.activityid 
    JOIN people ON peopleactivity.peopleid = people.peopleid 
UNION ALL 
SELECT activity.*, people.*, 'EA' 
    FROM activity 
    JOIN entityactivity ON entityactivity.activityid = activity.activityid 
    JOIN people ON entityactivity.entityid = people.peopleid 
관련 문제