Arquivo da tag: tabelas

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
--
-- 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:

1
2
3
4
5
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!

Copiar dados de um tabela para outra em MySQL

Hoje precisei copiar dados de uma tabela para outra. Mas como fazer isso facilmente atraves de linha de comando? … vou dizer, mas antes vamos as premissas:

* Não quero registros repetidos, neste caso o e-mail

* Não quero todos os dados da tabela Servidor (onde vou pegar os dados).

* So quero os e-mails começados com a letra “a”.

Então, vamos a dica:

1
INSERT INTO tabela2  (nome, email) SELECT nome, email FROM tabela1 WHERE (email LIKE 'a%') GROUP BY email

Logico que os dados acima são fictícios, mas funciona. A explicação basica é:

1- O comando INSERT como outro qualquer na tabela2 (a que vai receber os dados)

2- Em seguida vem um SELECT normal tambem, com os campos que desejo importar na mesma ordem que eu coloquei para inserir.

3- O WHERE para a condição dos e-mails começando com a letra “a”.

4- O GROUP BY para não repetir os e-mails. Poderia usar tambem o DISTINCT ou similar, fica a critério do fregues.

Se tiver alguma duvida sobre MySQL pode perguntar, se eu souber irei responder com certeza.