Mysql – Desafio: Relacionar 3 tabelas e exibir informações no mesmo select

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)

Caneca Brainatwork TI

O desafio esta lançado… e não esqueça de preencher os comentários com seu e-mail correto.

have fun!

10 comments

  1. 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

  2. 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

  3. 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! ;)

  4. 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! :)

  5. 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)

  6. Pode me mandar um email, diogo AT dourado.net

    … AT = @

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.