E ae galerinha, prontos para o desafio? Vamos la, primeiro vamos conhecer o banco de dados, segue abaixo:
--
-- Estrutura da tabela `categorias`
--
CREATE TABLE IF NOT EXISTS `categorias` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;
--
-- Extraindo dados da tabela `categorias`
--
INSERT INTO `categorias` (`id`, `nome`) VALUES
(1, 'legal'),
(2, 'alegre'),
(3, 'inteligente'),
(4, 'divertido'),
(5, 'sorridente'),
(6, 'engraçado');
-- --------------------------------------------------------
--
-- Estrutura da tabela `relacao`
--
CREATE TABLE IF NOT EXISTS `relacao` (
`usuario` int(11) NOT NULL,
`categoria` int(11) NOT NULL,
UNIQUE KEY `usuario` (`usuario`,`categoria`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
--
-- Extraindo dados da tabela `relacao`
--
INSERT INTO `relacao` (`usuario`, `categoria`) VALUES
(1, 1),
(1, 5),
(1, 6),
(2, 2),
(2, 4),
(2, 5),
(3, 5),
(3, 6),
(4, 1),
(4, 4),
(4, 6);
-- --------------------------------------------------------
--
-- Estrutura da tabela `usuarios`
--
CREATE TABLE IF NOT EXISTS `usuarios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
--
-- Extraindo dados da tabela `usuarios`
--
INSERT INTO `usuarios` (`id`, `nome`) VALUES
(1, 'magno'),
(2, 'diogo'),
(3, 'daniel'),
(4, 'tayna');
Devidamente apresentado o banco de dados, vamos as explicações. Como da pra perceber, são 3 tabelas contendo respectivamente uma lista de categorias, uma lista de relacionamentos e uma lista de usuários. Mas porque três tabelas e não duas? Porque sim! ;P~ Porque cada usuário pode ter N categorias relacionadas.
Ai esta o desafio, fazer um select que mostre a lista de usuários (sem repetir o usuário) e suas categorias relacionadas em apenas uma linha (um select). Como por exemplo:
NOME | CATEGORIAS
----------------------------
magno | legal, sorridente, engraçado
diogo | alegre, divertido, sorridente
etc...
Prêmio: Uma caneca exclusiva da Brainatwork TI (enviamos para qualquer lugar do mundo)
O desafio esta lançado… e não esqueça de preencher os comentários com seu e-mail correto.
have fun!
10 comments
Segue ai a minha solução:
select relacao.usuario, GROUP_CONCAT(categorias.nome) as categoria from categorias, relacao, usuarios where categorias.id = relacao.categoria and relacao.usuario = usuarios.id group by relacao.usuario
Valeuuu
SELECT usuarios.nome, GROUP_CONCAT(categorias.nome) AS categoria FROM categorias, relacao, usuarios WHERE categorias.id = relacao.categoria AND relacao.usuario = usuarios.id GROUP BY relacao.usuario
Luis, saiu na frente… vários tentaram mas você bateu o record. Em apenas uma hora resolveu com louvor o desafio! Parabéns a caneca vai chegar para você atravez das mãos (nada confiaveis) de Magno, beleza? auehaeuhaeueahhaeu… valeu… e até a proxima!!!
Quem quiser postar alternativas, esteja a vontade… mas a caneca, so na próxima agora! ;)
Valeuu. aguardo a caneca! /
Ae Douglas, voce trabalha junto com o Luis, ae não vale, ele foi mais rápido. Ainda essa semana vou fazer outro desafio, ok? :)
ok, o proximo vou ser mais rápido hehe
So para ilustra o resultado do Luis, foi o seguinte:
usuario | categoria
1 | legal,sorridente,engraçado
2 | alegre,divertido,sorridente
3 | sorridente,engraçado
4 | legal,divertido,engraçado
… é isso ae.. até a proxima pessoal! :)
Corrigindo..
No Sql Server ficaria assim…
SELECT relacao.usuario, Categorias
FROM usuarios, relacao
where relacao.usuario = usuarios.id
CROSS APPLY
( SELECT categorias.nome+ ‘, ‘
FROM categorias
WHERE categorias.id = relacao.categoria For XML PATH(”))a1 (Categorias)
Boa noite Digo queria entrar em contato com voce ,juro nao vou encher o saco eh algo serio !valeu cara !
Pode me mandar um email, diogo AT dourado.net
… AT = @