2012-07-18 4 views
1

"두 개 이상의 테이블에 참여하는 방법"에서 많은 양의 스레드를 보았지만 그 스레드 중 아무 것도 내 문제를 해결하지 못하는 것 같습니다. 나는 세 개의 테이블이 있습니다 teams, personspayfilesMySQL에서 3 개의 테이블을 "합치는"방법

teams 표는 다음과 같습니다

DROP TABLE IF EXISTS `teams`; 
CREATE TABLE IF NOT EXISTS `teams` (
`team_id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(20) DEFAULT NULL, 
`leader` varchar(32) NOT NULL, 
    PRIMARY KEY (`team_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=30;` 

persons 테이블 :

DROP TABLE IF EXISTS `persons`; 
CREATE TABLE IF NOT EXISTS `persons` (
    `team_id` int(2) DEFAULT '0', 
    `hash` varchar(32) NOT NULL, 
    UNIQUE KEY `hash` (`hash`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

payfiles 테이블 :

DROP TABLE IF EXISTS `payfiles`; 
CREATE TABLE IF NOT EXISTS `payfiles` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `hash` varchar(32) NOT NULL, 
    `deals_passed` int(2) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1298 ; 

테이블에는 훨씬 더 많은 열이 있지만 단순화를 위해 테이블을 잘라 냈습니다. 1, Team 1, afaf7878af78a 후자는 팀 리더의 고유 한 해시 :

teams 표는 다음과 같은 방법으로 기록이 포함되어 있습니다.

테이블 명

는 예를 에 대한 모든 개인 정보 및 고유 해시, 을 포함, 그 해시 또한 팀 1.

payfile 또한 "해시"가 테이블의 선두 주자입니다 afaf7878af78a입니다 홍길동 열에는 직원의 수표 계산에 필요한 모든 정보가 들어 있습니다.

경영진은 회사가 얼마나 많은 것을하고 있는지에 대한 전반적인 비전을 원합니다. 그들은 모든 단일 팀이 초래되어 얼마나 많은 돈을보고 싶어요.

내가 여기에 직면하고있어 문제 "팀"

에 의해 그룹에 이익을하려고 내 최고의 지금까지 노력이

입니다

SELECT hash, SUM(deals_passed) as deals FROM payfiles JOIN persons ON persons.hash = payfiles.hash GROUP BY payfiles.hash

하지만 나는 데이터베이스의 구조를 변경하지 않고 소득의 팀 일반 비전으로 팀을 생성하기 위해 데이터베이스를 조회 할 수있는 최적의 방법을 볼 수 없습니다.

예 : John Doe 및 Jane Doe는 "팀 1"에 속해 있으며 각각 500 달러 및 600 달러를 가져 왔습니다.

내가 좋아하는 뭔가를 생성 할 :

"가져온 팀 1 $ (1100)"

내 다른 데이터베이스의 구조를 변경하고 payfile 테이블에 새 열을 추가하는 것입니다. 이러한 열은 team_id이 될 것이므로 쉽게 쿼리 할 수 ​​있지만 데이터베이스에는 현재 약 10,000 개의 레코드가 있으므로 team_id 열을 고려하지 않은 10K 레코드를 업데이트하고 GUI에 많은 변경을가합니다. 그게 가장 쉽고 최선의 선택이라면 그렇게 할거예요.

감사합니다.

답변

1
SELECT 
    teams.name, 
    SUM(payfiles.deals_passed) AS team_deals_passed 
FROM payfiles 
LEFT JOIN persons USING (hash) 
LEFT JOIN teams USING (team_id) 
GROUP BY teams.team_id 
+0

매력처럼 작동합니다. 정말 고마워! 하지만 조금 혼란 스럽습니다. – ILikeTacos

+0

최신 'LEFT JOIN'은 각 팀에 속한 팀을 어떻게 "아나요"? – ILikeTacos

+1

'USING (hash)'는 새 테이블 "해시"열을 이전 테이블의 "해시"와 연결합니다.이 경우 payfiles.hash는 새 테이블 팀을 이전 테이블에 연결하는 'USING (team_id)'과 동일합니다. team_id,이 경우 persons.team_id, 체인을 얻은 것입니다. payfiles- (hash) -persons- (team_id) -teams –

0

SUM()을 사용하여 합계를 구하고 팀에 GROUP BY를 사용하여 팀별로 각 합계를 얻을 수 있습니다.

관련 문제