Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

[ GuTo ]

Quero construir uma query, pode ser Stored Procedure ou View

Recommended Posts

Olá pessoal,

 

Tenho duas tabelas em meu banco de dados MySQL 5, sendo:

- usuarios ( id, nome)

- usuarios_telefones ( id, id_usuario, telefone )

 

A tabela usuarios, guarda todos os usuarios cadastrados.

A tabela usuarios_telefones, guarda os numeros de telefone de cada usuários, sendo que cada usuário, pode ter um ou mais telefones.

 

Quero fazer uma instrução que me retorne o usuario e seus telefones.

Fiz uma instrução SQL assim:

SELECT u.id, u.nome, t.telefone FROM usuarios AS s INNER JOIN usuarios_telefones AS t ON s.id = t.id_usuario
Beleza, está tudo quase certo.

Se o usuário tiver um telefone, beleza. A instrução vai me retornar apenas um registro (row).

Ex.: 25, guto, 5134761122

 

Agora, se o usuário tiver mais de um telefone, ele vai me devolver X registros, de acordo com o numero de telefones que o usuario tiver.

Por ex, eu tenho telefone de casa, celular e da empresa, meus. Executando esta instrucao SQL, vai me retornar assim, 3 registros (rows):

25, guto, 5134761122

25, guto, 5134763344

25, guto, 5134765566

E o que eu gostaria, é que me retornasse, algo assim:

25, guto, 5134761122, 5134763344, 5134765566

sendo id do usuario, nome do usuario, telefone1, telefone2 e telefone3.

 

Talvez com STORED PROCEDURE ou uma VIEW eu consiga ter isso...

 

Alguém tem idéia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

E ae,

você pode utilizar o Group_Concat para agrupar estes registros sem ser que sejam retornados em várias linhas, o único prob. é que estes registros ficarão em apenas uma coluna, separados por um caracter que você definir, ex:

CREATE TABLE `usuario` (

`ID_USU` int(11) NOT NULL auto_increment,

`NOME_USU` varchar(50) default NULL,

PRIMARY KEY (`ID_USU`)

) ENGINE=MyISAM;

 

CREATE TABLE `usuariotel` (

`ID_TEL` int(11) NOT NULL auto_increment,

`ID_USU` int(11) default NULL,

`TELEFONE` varchar(20) default NULL,

PRIMARY KEY (`ID_TEL`)

) ENGINE=MyISAM;

 

insert into `usuario` (`ID_USU`,`NOME_USU`) values (1,'Teste');

insert into `usuario` (`ID_USU`,`NOME_USU`) values (2,'Teste2');

 

insert into `usuariotel` (`ID_TEL`,`ID_USU`,`TELEFONE`) values (1,1,'2544-2568');

insert into `usuariotel` (`ID_TEL`,`ID_USU`,`TELEFONE`) values (2,1,'3333-2222');

insert into `usuariotel` (`ID_TEL`,`ID_USU`,`TELEFONE`) values (3,1,'4578-9865');

Query:

SELECT USU.ID_USU,USU.NOME_USU,

/*Agrupar todos os telefones (ordenados) do usuário*/

GROUP_CONCAT(TEL.TELEFONE ORDER BY TEL.TELEFONE SEPARATOR ';') AS TELEFONES

FROM usuario USU

INNER JOIN usuariotel TEL ON TEL.ID_USU = USU.ID_USU

/*Agrupado por usuário*/

GROUP BY USU.ID_USU

ORDER BY USU.NOME_USU

Quiser saber mais sobre o group_concat veja neste link.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, já tinha visto sua resposta mas não tinha testado ela pq não tinha precisado dela.Mas voltei aqui agora, testei e funcionou redondinho. Você é fera!Valeu mesmo.Boa sexta e um bom findi.Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.