피벗

2014-02-05 6 views
1

을 사용하여 2 개의 테이블을 조인 할 수있는 사람이 누구입니까?피벗

두 테이블이 있습니다.

user_info (이름, 이름, 성, 주소)를 AND user_contact (이름, 번호, 주, 대체) user_contacts에

예 필드
('ABC', XXX-xxx- XXXX, 1,0)
('ABC', XXX-XXX-XXXX, 0,1)
('ABC', XXX-XXX-XXXX, 0,1)
('ABC', XXX-XXX ('def', xxx-xxx-xxxx, 1,0),453,210 ('DEF', XXX-XXX-XXXX, 0,1)
('DEF', XXX-XXX-XXXX는 0,1)

이 사용자가 하나 이상의 다른 전화를 가질 수 있음을 의미 번호.

는 내가하고 싶은,
두 개의 테이블을 조인하고, 같은 결과를 얻을 수있다 (사용자 이름, 기본 전화 번호, 대체 NUM1, 대체 num2를 대체 num3을 ..)

그래서 무엇을 가지고 지금까지는이 것이지만, 이것은 나에게 단 하나의 대체 번호를 부여 할 수 있으며 모든 것을 제공 할 수는 없습니다.

select username,firstname,lastname,address, 
     sum(if(c.primary=1,c.number,NULL) as primary, 
     sum(if(c.alternate=1,c.number,NULL) as alternate 
from user_info as i left join 
    user_contact as c 
    on i.username = c.username 
group by username 

많은 도움을 부탁드립니다. 나는 피봇 테이블을 읽었지만, 나의 의심에 대답하는 것을 찾을 수 없었다. ADV에서

감사합니다 나를 위해이 문제를 해결하려고 모든 사람에게

+0

프리젠 테이션 층/응용 프로그램 수준의 코드에서 데이터 표시의 문제를 처리 고려 이런 식으로 간다 (을 예를 들어 순서 배열에 작용하는 간단한 PHP 루프) 내가, 내가 사용 않았다 동의 – Strawberry

+0

PHP,하지만 그렇게하려면 MySQL을 사용해야합니다. – Aman

답변

0

감사합니다. 나는 그것에 대한 해답을 알아 냈다. 당신은 호기심이 있다면, 그것은

select username, firstname,lastname,address, 
max(if(uc.`primary`=1 AND uc.row_num=1, uc.number,0)) as phone, 
max(if(uc.row_num=2, uc.number,0)) as alt1, 
max(if(uc.row_num=3, uc.number,0)) as alt2, 
max(if(uc.row_num=4, uc.number,0)) as alt3, 
max(if(uc.row_num=5, uc.number,0)) as alt4 
from user_info as ui 
left join 
(
Select username, number,`primary`,alternate, 
    if(@type = username,@rowNum:[email protected]+1,@rowNum:=1) as row_num, 
    @type := username as `type` 
from user_contact , (select @rowNum:=0 , @type:='') as r 
group by username, number 
order by username, `primary` desc 
) as uc 
on ui.username = uc.username 
order by username