Michael Mafort

Série facilidades para sua vida – Parte 1: Criando views

by on jan.21, 2009, under Facilidades para sua vida, Linux, Mysql, PHP

Este é o primeiro post de uma série que poderá lhe ajudar na hora de fazer algo de uma forma mais prática, rápida e elegante. Neste primeiro post vamos tratar das queries gigantes que as vezes encontramos em alguns códigos por ai.Vejamos um exemplo:
Temos as tabelas: usuarios, produtos, vendas, venda_produtos e venda_status.

Onde os campos das tabelas sejam:

usuarios -> id, nome, telefone, endereco
produtos -> id, descricao, valor
vendas -> id, usuario_id, data, venda_status_id
venda_produtos -> id, venda_id, produto_id
venda_status -> id, descricao

Criando as tabelas:

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
CREATE DATABASE teste_view;
 
USE teste_view;
 
CREATE TABLE usuarios(
 
    id int(11) not null auto_increment primary key,
 
    nome varchar(60) not null,
 
    telefone varchar(15),
 
    endereco varchar(200)
 
);
 
CREATE TABLE produtos(
 
    id int(11) not null auto_increment primary key,
 
    descricao varchar(120) not null,
 
    valor decimal(4,2)
 
);
 
CREATE TABLE vendas(
 
    id int(11) not null auto_increment primary key,
 
    usuario_id int(11) not null,
 
    data datetime,
 
    venda_status_id int(11),
 
    index usuario_id(usuario_id),
 
    index venda_status_id( venda_status_id )
 
);
 
CREATE TABLE venda_produtos(
 
    id int(11) not null auto_increment primary key,
 
    venda_id int(11) not null,
 
    produto_id int(11) not null,
 
    index venda_id( venda_id ),
 
    index produto_id( produto_id )
 
);
 
CREATE TABLE venda_status(
 
    id int(11) not null auto_increment primary key,
 
    descricao varchar(60) not null,
 
    index descricao( descricao )
 
);

Insira dados nas tabelas:

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
#Adicionando usuarios
 
INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'José pereira', '31 3333-3333', 'rua dos subidos, 123' );
 
INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'Maria pereira da silva', '31 4444-4444', 'rua das marias, 12' );
 
INSERT INTO usuarios (nome, telefone, endereco) VALUES ( 'Willy Nelson', '31 5555-5555', 'rua dos cantores, 120' );#Adicionando produtos
 
INSERT INTO produtos ( descricao, valor ) VALUES ('CAMERA DIGITAL',199.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('FILMADORA',999.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('GELADEIRA',899.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('FOGÃO',399.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('CHURRASQUEIRA',99.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('NOTEBOOK',1999.50);
 
INSERT INTO produtos ( descricao, valor ) VALUES ('MONITOR LCD 15',399.50);
 
#Adicionando status de vendas
 
INSERT INTO venda_status (descricao) VALUES ('Em processamento');
 
INSERT INTO venda_status (descricao) VALUES ('Aguardando pagamento');
 
INSERT INTO venda_status (descricao) VALUES ('Aprovada');
 
INSERT INTO venda_status (descricao) VALUES ('Cancelada');
 
#Adicionando vendas
 
INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (1, '2009-01-20 10:20:00', 1);
 
INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (2, '2009-01-22 10:22:00', 2);
 
INSERT INTO vendas (usuario_id, data, venda_status_id) VALUES (1, '2009-01-22 10:44:00', 4);
 
#Adicionando produtos as vendas
 
#Nessa compra joão comprou uma camera digital e uma filmadora
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (1,1);
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (1,2);
 
#Nessa foram comprados por maria um fogão e uma geladeira
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (2,4);
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (2,3);
 
#Nessa o joão comprou um notebook
 
INSERT INTO venda_produtos (venda_id, produto_id) VALUES (3,6);

Agora suponhamos que vc queira agrupar estas informações num único select, então teremos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
SELECT produtos.descricao AS produto_descricao, produtos.valor AS produto_valor,
 
usuarios.nome AS usuario_nome, usuarios.telefone AS usuario_telefone, usuarios.endereco AS usuario_endereco,
 
venda_status.descricao AS venda_status,
 
vendas.id AS venda_id,
 
vendas.data AS venda_data
 
FROM vendas
 
INNER JOIN venda_produtos ON ( vendas.id = venda_produtos.venda_id )
 
INNER JOIN produtos ON ( produtos.id = venda_produtos.produto_id )
 
INNER JOIN usuarios ON ( usuarios.id = vendas.usuario_id )
 
INNER JOIN venda_status ON ( venda_status.id = vendas.venda_status_id )

Agora suponhamos que vc use este select em 3 lugares diferentes, então vc vai ter que passar esta query em 3 locais distintos, podendo gerar uma confusão na hora da manutenção, então para isto existem as views. Elas simulam uma tabela, agem como uma tabela, mas só estão disponíveis para exibir os dados, não podendo sofrer exclusão ou alteração de registros, muito útil ela nestes casos que acabamos ficando com uma query gigante para simplificar nossas vidas.

então para criar a view basta vc adicionar antes da query CREATE VIEW nome_da_view AS ( aqui entra a query ).

Ex.:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE VIEW view_vendas AS ( SELECT produtos.descricao AS produto_descricao, produtos.valor AS produto_valor,
 
usuarios.nome AS usuario_nome, usuarios.telefone AS usuario_telefone, usuarios.endereco AS usuario_endereco,
 
venda_status.descricao AS venda_status,
 
vendas.id AS venda_id,
 
vendas.data AS venda_data
 
FROM vendas
 
INNER JOIN venda_produtos ON ( vendas.id = venda_produtos.venda_id )
 
INNER JOIN produtos ON ( produtos.id = venda_produtos.produto_id )
 
INNER JOIN usuarios ON ( usuarios.id = vendas.usuario_id )
 
INNER JOIN venda_status ON ( venda_status.id = vendas.venda_status_id ) );

Bom agora vc já tem a sua view, para buscar os dados a partir dela faça um select normal. Ex.:

1
2
3
4
5
6
7
SELECT sum(produto_valor) FROM view_vendas;
 
#ou com um where agora
 
SELECT sum(produto_valor) FROM view_vendas WHERE venda_id = 1;#para visualizar todas as suas views basta dar um SHOW TABLES, que ela estará la como uma tabela.
 
#para certificar que é uma view e não uma tabela mesmo vc pode confirmar usando SHOW CREATE TABLE nome_da_view;

Bom por hoje é só.

Espero que isto possa facilitar um pouco a sua vida.

Abraços,


Leave a Reply

Procurando por algo?

Digita ai pra ver se encontramos:

Não achou o que procurava? Envie um comentário para o autor informando o que deseja!

Meus amigos!

Links recomendados