BetoGroo Postado Março 17, 2009 Denunciar Share Postado Março 17, 2009 (editado) Bom diaTenho as seguintes tabelas relacionadas: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 , 30Tenho o seguinte resultado: nome_funcnumero_telnome_tipo_telADALBERTO TORRES9999-2222CELULARADALBERTO TORRES3333-3333FIXOGIORGINA NAVARRO3333-4444FIXOJULIO CESAR9999-9999CELULARTEO MAIA3333-2222FIXOGostaria que fosse exibido da seguinte maneira: nomeFIXOCELULARADALBERTO TORRES3333-33339999-222GIORGINA NAVARRO3333-4444 JULIO CESAR 9999-9999TEO 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 Abril 14, 2009 por Denis Courcy Melhorar título para pesquisa Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Março 18, 2009 Denunciar Share Postado Março 18, 2009 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 More sharing options...
0 BetoGroo Postado Março 18, 2009 Autor Denunciar Share Postado Março 18, 2009 Muito obrigado! Deu tudo certo aqui!Agora posso continuar com meu projeto!Um abraço, e mais uma vez obrigado :rolleyes: Link para o comentário Compartilhar em outros sites More sharing options...
0 BetoGroo Postado Março 23, 2009 Autor Denunciar Share Postado Março 23, 2009 (editado) Da maneira como respondido, a consulta tem o seguinte resultado: NOMEFIXOCELULARADALBERTO TORRES3333-3333 ADALBERTO TORRES 9999-2222GERORGINA NAVARRO3333-4444 JULIO CÉSAR 9999-9999TEO MAIA3333-2222 Repare que é criada duas linhas para o "ADALBERTO TORRES".Gostaria de saber se tem como retornar assim: nomeFIXOCELULARADALBERTO TORRES3333-33339999-222GIORGINA NAVARRO3333-4444 JULIO CESAR 9999-9999TEO MAIA3333-2222 Onde o "ADALBERTO TORRES" aparece com os dois telefones cadastrados, porém, na mesma linha!Um abraço, e muito obrigado! Editado Março 26, 2009 por Denis Courcy Melhorar entendimento Link para o comentário Compartilhar em outros sites More sharing options...
0 Denis Courcy Postado Março 23, 2009 Denunciar Share Postado Março 23, 2009 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 More sharing options...
0 BetoGroo Postado Março 24, 2009 Autor Denunciar Share Postado Março 24, 2009 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: 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_telPoré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 More sharing options...
0 BetoGroo Postado Março 24, 2009 Autor Denunciar Share Postado Março 24, 2009 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 NOMEEntã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 More sharing options...
Pergunta
BetoGroo
Bom dia
Tenho as seguintes tabelas relacionadas:
Com a seguinte instrução:
Tenho o seguinte resultado:
Gostaria que fosse exibido da seguinte maneira:
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 CourcyMelhorar título para pesquisa
Link para o comentário
Compartilhar em outros sites
6 respostass a esta questão
Posts Recomendados