Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Retornar Consulta na mesma linha


BetoGroo

Pergunta

Bom dia

Tenho as seguintes tabelas relacionadas:

tabelas.png

Com a seguinte instrução:

SELECT f.nome_func, t.numero_tel, tt.nome_tipo_tel
FROM funcionario f, telefone t, tipo_telefone tt
WHERE f.id_func = t.funcionario_id_func
AND id_tipo_tel = tipo_telefone_id_tipo_tel
ORDER BY f.nome_func
LIMIT 0 , 30

Tenho o seguinte resultado:

 
nome_funcnumero_telnome_tipo_tel
ADALBERTO TORRES9999-2222CELULAR
ADALBERTO TORRES3333-3333FIXO
GIORGINA NAVARRO3333-4444FIXO
JULIO CESAR9999-9999CELULAR
TEO MAIA3333-2222FIXO

Gostaria que fosse exibido da seguinte maneira:

 
nomeFIXOCELULAR
ADALBERTO TORRES3333-33339999-222
GIORGINA NAVARRO3333-4444 
JULIO CESAR 9999-9999
TEO MAIA3333-2222 
   

Qual seria a instrução SQL, de modo que meus dados fosse exibidos, de acordo com esta tabela?

Desculpe-me pela maneira que expus minha dúvida. Não encontrei palavras, então resolvi usar algo visual.

Muito obrigado!

Editado por Denis Courcy
Melhorar título para pesquisa
Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Oi, 'BetoGroo'

Faça assim, para obter o que desejas:

SELECT f.nome_func, IF(tt.nome_tipo_tel = "FIXO", t.numero_tel, "") AS FIXO, IF(tt.nome_tipo_te l= "CELULAR", t.numero_tel, "") AS CELULAR
FROM funcionario f, telefone t, tipo_telefone tt
WHERE f.id_func = t.funcionario_id_func
AND id_tipo_tel = tipo_telefone_id_tipo_tel
ORDER BY f.nome_func
LIMIT 0 , 30

Link para o comentário
Compartilhar em outros sites

  • 0

Da maneira como respondido, a consulta tem o seguinte resultado:

 
NOMEFIXOCELULAR
ADALBERTO TORRES3333-3333
ADALBERTO TORRES 9999-2222
GERORGINA NAVARRO3333-4444
JULIO CÉSAR 9999-9999
TEO MAIA3333-2222

Repare que é criada duas linhas para o "ADALBERTO TORRES".

Gostaria de saber se tem como retornar assim:

 
nomeFIXOCELULAR
ADALBERTO TORRES3333-33339999-222
GIORGINA NAVARRO3333-4444
JULIO CESAR 9999-9999
TEO MAIA3333-2222

Onde o "ADALBERTO TORRES" aparece com os dois telefones cadastrados, porém, na mesma linha!

Um abraço, e muito obrigado!

Editado por Denis Courcy
Melhorar entendimento
Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'BetoGroo'

Faça assim:

SELECT f.nome_func, 
       TRIM(GROUP_CONCAT(IF(tt.nome_tipo_tel = "FIXO", t.numero_tel, "") SEPARATOR "")) AS FIXO, 
       TRIM(GROUP_CONCAT(IF(tt.nome_tipo_tel = "CELULAR", t.numero_tel, "") SEPARATOR "")) AS CELULAR 
FROM telefone t
INNER JOIN funcionario f ON f.id_func = t.funcionario_id_func
INNER JOIN tipo_telefone tt ON id_tipo_tel = tipo_telefone_id_tipo_tel
GROUP BY f.nome_func
LIMIT 0 , 30;

Link para o comentário
Compartilhar em outros sites

  • 0
Oi, 'BetoGroo'

Faça assim:

SELECT f.nome_func, 
       TRIM(GROUP_CONCAT(IF(tt.nome_tipo_tel = "FIXO", t.numero_tel, "") SEPARATOR "")) AS FIXO, 
       TRIM(GROUP_CONCAT(IF(tt.nome_tipo_tel = "CELULAR", t.numero_tel, "") SEPARATOR "")) AS CELULAR 
FROM telefone t
INNER JOIN funcionario f ON f.id_func = t.funcionario_id_func
INNER JOIN tipo_telefone tt ON id_tipo_tel = tipo_telefone_id_tipo_tel
GROUP BY f.nome_func
LIMIT 0 , 30;
Valeu, deu certo! Porém me deparei com outro problema! Aumentei algumas tabelas em meu banco, que ficou com esta estrutura: banco.png E tentei esta consulta, baseada na explicação do Denis Courcy.
SELECT f.nome_func AS NOME, c.nome_cargo AS CARGO, d.nome_dele AS DELEGACIA,
TRIM(GROUP_CONCAT(IF(tt.nome_tipo_tel = "FIXO", t.numero_tel, "") SEPARATOR "")) AS FIXO,
TRIM(GROUP_CONCAT(IF(tt.nome_tipo_tel = "CELULAR", t.numero_tel, "") SEPARATOR "")) AS CELULAR
FROM funcionario f
INNER JOIN cargo c ON c.id_cargo = f.rl_id_cargo
INNER JOIN delegacia d ON d.id_dele = f.rl_id_dele
INNER JOIN telefone t ON f.id_func = t.rl_id_func
INNER JOIN tipo_telefone tt ON  tt.id_tipo_tel = t.rl_id_tipo_tel

Porém me retorna apenas uma linha, com todos os fixos e celulares cadastrados em apens uma linha!

Onde está meu erro na consulta?

Aproveitando, alguém indica um bom livro de Modelagem de Dados"?

Muito obrigado!

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, achei o problema! Ele se chama falta de atenção.

Faltou o "group by " no final da instrução:

SELECT f.nome_func AS NOME, c.nome_cargo AS CARGO, d.nome_dele AS DELEGACIA,
TRIM(GROUP_CONCAT(IF(tt.nome_tipo_tel = "FIXO", t.numero_tel, "") SEPARATOR "")) AS FIXO,
TRIM(GROUP_CONCAT(IF(tt.nome_tipo_tel = "CELULAR", t.numero_tel, "") SEPARATOR "")) AS CELULAR
FROM funcionario f
INNER JOIN cargo c ON c.id_cargo = f.rl_id_cargo
INNER JOIN delegacia d ON d.id_dele = f.rl_id_dele
INNER JOIN telefone t ON f.id_func = t.rl_id_func
INNER JOIN tipo_telefone tt ON  tt.id_tipo_tel = t.rl_id_tipo_tel
GROUP BY NOME

Então está resolvido!

Se alguém tiver dicas de bons livros sobre modelagem de dados, me de um toque!

Abraço a todos e obrigado!

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...