2013-02-12 3 views
3
나는 다음과 같은 테이블이

사용하여 가입 왼쪽 :MySQL은 하나의 행

mysql> select * from `empresas`; 
+----+-------+-----------+-------+------------+----------------+ 
| id | tipo | logotipo | nome | grupo  | cnpj   | 
+----+-------+-----------+-------+------------+----------------+ 
| 8 | Lazer | troll.jpg | Teste | Pespi Cola | 99999313412312 | 
+----+-------+-----------+-------+------------+----------------+ 

mysql> select * from `empresas_contatos`; 
+----+---------+------------+--------------+------------+ 
| id | empresa | rotulo  | email  | telefone | 
+----+---------+------------+--------------+------------+ 
| 1 |  8 | Principal | [email protected] | 5112121212 | 
| 2 |  8 | Financeiro | [email protected] | 5012121212 | 
+----+---------+------------+--------------+------------+ 

을 그리고는 다음과 같이 모두 가입 왼쪽으로 사용하고 싶지 :

mysql> select `e`.`nome`, `e`.`grupo`, `c`.* from `empresas` `e` 
    -> left join `empresas_contatos` `c` on 
    -> `c` . `empresa` = `e` . `id`; 
+-------+------------+------+---------+------------+-------------+------------+ 
| nome | grupo  | id | empresa | rotulo  | email  | telefone | 
+-------+------------+------+---------+------------+-------------+------------+ 
| Teste | Pespi Cola | 1 |  8 | Principal | [email protected] | 5112121212 | 
| Teste | Pespi Cola | 2 |  8 | Financeiro | [email protected] | 5012121212 | 
+-------+------------+------+---------+------------+-------------+------------+ 

문제는 그 이런 식으로 쿼리는 grupo, nome과 같이 empresas 필드를 반복합니다 (실제 테이블이 예제보다 큽니다!).

모든 데이터를 한 줄로받을 수있는 방법을 알고 싶습니다. 결과는 그런 일해야한다 :

+-------+------------+------+---------+------------+-------------+------------+-------------+------------+ 
| nome | grupo  | id | empresa | rotulo  | email1  | telefone1 | email2  | telefone2 | 
+-------+------------+------+---------+------------+-------------+------------+-------------+------------+ 
| Teste | Pespi Cola | 1 |  8 | Principal | [email protected] | 5112121212 | [email protected] | 5012121212 | 
+-------+------------+------+---------+------------+-------------+------------+-------------+------------+ 

를 제 3 empresas_contatos 행이있는 경우, 쿼리가 반환 email3, telefone3 ...

내가 GROUP_CONCAT()를 사용할 수 있지만 궁금 해요 이를위한 해결책을 찾으십시오.

미리 감사드립니다.

답변

2

당신은 본질적으로 PIVOT을 시도하고 있습니다. 여기서 문제는 행 식별자를 PIVOT에 대해 필요로한다는 것입니다. 그것이 내가 당신의 empresa 컬럼에 의해 Grouped By Row Number를 소개 한 곳입니다.

이렇게하면 효과가 있지만 잠재적 인 최대 열 수를 알아야합니다.

select g.empresa, 
    MAX(CASE WHEN rownum = 1 THEN g.email END) Email1, 
    MAX(CASE WHEN rownum = 2 THEN g.email END) Email2, 
    MAX(CASE WHEN rownum = 1 THEN g.telefone END) Phone1, 
    MAX(CASE WHEN rownum = 2 THEN g.telefone END) Phone2 
from (
    select id,empresa,email,telefone, 
     @running:=if(@previous=empresa,@running,0) + 1 as rownum, 
     @previous:=empresa 
    from empresas_contatos t 
     JOIN (SELECT @running:= 0) r 
     JOIN (SELECT @previous:= 0) s 
) g 
GROUP BY g.empresa 

을 그리고 여기에 SQL Fiddle이다 : 그러나 그럼에도 불구하고,이 얻을 도움이 될 것입니다 당신은 시작했다.

BTW - 또한 rotulo 열이 중복 된 논리와 동일한 논리를 필요로하는 것처럼 보입니다.

select e.nome, e.grupo, g.empresa, 
    MAX(CASE WHEN rownum = 1 THEN g.rotulo END) Rotulo1, 
    MAX(CASE WHEN rownum = 2 THEN g.rotulo END) Rotulo2, 
    MAX(CASE WHEN rownum = 1 THEN g.email END) Email1, 
    MAX(CASE WHEN rownum = 2 THEN g.email END) Email2, 
    MAX(CASE WHEN rownum = 1 THEN g.telefone END) Phone1, 
    MAX(CASE WHEN rownum = 2 THEN g.telefone END) Phone2 
from (
    select id,empresa,email,telefone,rotulo, 
     @running:=if(@previous=empresa,@running,0) + 1 as rownum, 
     @previous:=empresa 
    from empresas_contatos t 
     JOIN (SELECT @running:= 0) r 
     JOIN (SELECT @previous:= 0) s 
) g JOIN empresas e on g.empresa = e.id 
GROUP BY e.nome, e.grupo, g.empresa 

그리고 더 Fiddle : 나는 empresas_contatos.id을 제거하지만, 당신이 그것을 원한다면, 또 다른 MAX 사례를 추가 - 여기

사용자의 요구에 맞게 좀 더 기능적인 작업 예입니다.

+0

굉장! 고마워요! 귀하의 회신을 기반으로 이것을 만들었습니다 : http://sqlfiddle.com/#!2/b8c4a/2 하지만이 쿼리는 많은 복사 및 붙여 넣기가 필요하므로 100 % 만족하지는 않습니다. hehe. 더 "자동"으로 만들기 위해 쿼리를 향상 시키려고 노력할 것이지만 정말 대답에 감사드립니다. 고맙습니다! –

+0

@MatheusTavares - np, 기꺼이 도와 드리겠습니다. MySQL의 피벗 테이블은 다른 RDBMS보다 약간 어렵습니다. 행운을 빌어 요. – sgeddes

1

왜 이렇게 했습니까? 이 쿼리를 실행 한 후에 데이터를 어떻게 사용합니까? 스프레드 시트로 가져 오거나 다른 방법으로 처리합니까?

데이터를 원하는대로 만들기 위해 사후 처리하는 것이 더 쉽습니다.