Ir para conteúdo

POWERED BY:

Arquivado

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

visitante_php

[Resolvido] Sql

Recommended Posts

eu estou com a seguinte modelagem...

 

db.png

 

na tabela horarios, vai ter registros assim: 7:00,7:30, 8:00,8:30 etc...ae na agenda eu armazeno o horario, o colaborador, o cliente, e o servico, eu gostaria de montar uma tabela onde:

 

|7:00|colaborador baiana|cliente beltrana|fazer pe|data tal

------------------------------------------------------------------------------

|7:30| | | |

------------------------------------------------------------------------------

|8:00| | | |

------------------------------------------------------------------------------

|8:30|colaborador baiana|cliente cicrana |fazer mao| data y

------------------------------------------------------------------------------

 

eu nao estou conseguindo a sql q faça isto....eu gostaria de q alguem pudesse me mostrar o caminho...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que vai ter de existir uma tabela

 

cliente_colaborados_horario

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara .. sua modelagem tá feia .. alias, feia não, horrível !

 

Serviços.valor = varchar ? .. quer dizer então que o preço que é pago por um serviço, você grava como string !?

Produtos.valor = varchar ? .. veja a primeira objeção ..

 

Complemento = varchar ? um complemento nem sempre é uma referência de local, o cara pode dar uma referencia, e outra e outra e .. existem ruas complicadas, a questão não é o tamanho, mas sim a forma que isto será exibido, portanto deve ser TEXT.

 

Clientes.datanasc = varchar ? 'data' .. utiliza-se campos DATE

Cidade.varchar ? correto, mas pra que essa ignorância toda de 245 caracteres ? .. não existe cidade, principalmente brasileira que passe dos 50.

 

Agora, por partes

 

Um colaborador, vejo que é uma replica de clientes, logo esse 'colaborador', você define ele um usuário com mais importância ou algo associado ao estabelecimento ?

Se for, sua tabela de colaboradores deveria ser removida, e criar uma identificação em clientes, logo um campo 'colaborador' ( true | false ) , tipo boleano

 

Um serviço está relacionado a um cliente logo o cliente com o serviço contratado ? se sim , então a ligação deve existir, portanto você deve aplicar uma técnica chamada 'junction table' para resolver esse problema.

 

Aguardo suas respostas em relação as minhas perguntas, daí continuamos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que vai ter de existir uma tabela

 

cliente_colaborados_horario

sim, por isso existe a tabela agenda

sobre os valores, eu irei formatar antes de ir para o banco vao como R$ preço, e nao so numero...

sobre o campo date, esta ah a primeira modelagem, eu realmente ia mudar pra date...

 

sobre colaborador, no caso, eh um sistema pra salao de cabelereiros, no caso sei q existe a recepcao q eh um funcionario, mas existem as outras funcionarias, dae eu fiquei sem nome a dar, entao eu chamei de colaborador, como sua sugestao eu realmente irei precisar colocar um campo de q especialidade eh este colaborador, (manicure, depiladora etc)

 

so nao fiz as ligacoes pq todas as vezes q eu faço uma ligacao, e coloco alguns indices o mysql reclama, como por exemplo ali no colaborador e clientes tem ligacao com estados, no caso, quando eu jogar mais de um registro com o mesmo estado no cliente ou colaborador , o mysql vai chiar...entao la eu terei q desfazer a ligacao dos indices, e colocar so o valor...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá, Igor.

 

Cara, por que você não trata as suas "strings" no próprio PHP? Eu acho mais utilizável e inteligente. Em outras palavras, campos como CPF poderiam virar inteiros e você os trata em PHP. Você deve imaginar o porquê.

 

E mais, MySQL chiar???????????? Se ele "chia" é porque tem algo errado. ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

sobre os valores, eu irei formatar antes de ir para o banco vao como R$ preço, e nao so numero...

Errado, não devem em caso algum ir com 'R$', não importa se vai usar CONCAT no banco .. para exibir com R$, o MySQL tem seus próprios tipos campos que se encaixam pra valor monetário.

 

esta ah a primeira modelagem

 

Tipo, sem ofensas .. isso não é modelagem.

 

sobre colaborador, no caso, eh um sistema pra salao de cabelereiros, no caso sei q existe a recepcao q eh um funcionario, mas existem as outras funcionarias, dae eu fiquei sem nome a dar, entao eu chamei de colaborador, como sua sugestao eu realmente irei precisar colocar um campo de q especialidade eh este colaborador, (manicure, depiladora etc)

 

Faça isso, mas pense no que eu te falei sobre exonerar essa tabela de colaboradores aí, se você colocar a identificação, você vai poder gerenciar da mesma forma, além do mais, evita ficar separando o que é desnecessário, e evita escrever SQL desnecessária.

 

so nao fiz as ligacoes pq todas as vezes q eu faço uma ligacao, e coloco alguns indices o mysql reclama, como por exemplo ali no colaborador e clientes tem ligacao com estados, no caso, quando eu jogar mais de um registro com o mesmo estado no cliente ou colaborador , o mysql vai chiar...entao la eu terei q desfazer a ligacao dos indices, e colocar so o valor...

 

Exemplifique isso aí, porque eu não sei como o mysql 'chia' por causa de índices, e por favor .. com exemplos executados ou imagens para descrever o problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra reforçar o que o Andrey disse, pra que duas tabelas idênticas?

 

Se você quer um tratamento mais semântico que dá no mesmo, faça algo assim:

   `tipo` enum("Cliente", "Colaborador");

 

Sério, cara. Dá exatamente no mesmo e menos trabalho pro SQL.

 

Acho que o único maior esforço que você vai ter que fazer é uma função para diferenciar um cliente de colaborador, mas isso, cá entre nós, é babada, né? :P

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, andrey, ok....

Faça isso, mas pense no que eu te falei sobre exonerar essa tabela de colaboradores aí, se você colocar a identificação, você vai poder gerenciar da mesma forma, além do mais, evita ficar separando o que é desnecessário, e evita escrever SQL desnecessária.

 

de certa forma você esta certo, mas onde fica a normalizacao? o colaborador vai ter login e senha, o cliente nao..ficarao 2 colunas vazias...ah, eu nao necessito de performance, rodara local...

Compartilhar este post


Link para o post
Compartilhar em outros sites

de certa forma você esta certo, mas onde fica a normalizacao? o colaborador vai ter login e senha, o cliente nao..ficarao 2 colunas vazias...ah, eu nao necessito de performance, rodara local...

 

E daí, performance não porque é externo ou local não, vale pra ambos, que normalização, veja o custo-benefício nesse caso, você vai ter muitos mais campos que poderiam ser unificados em uma única tabela, ao invés de ter 3, sendo um uma identificação, e os outros como 'NULL'

Compartilhar este post


Link para o post
Compartilhar em outros sites
na tabela horarios, vai ter registros assim: 7:00,7:30, 8:00,8:30 etc...ae na agenda eu armazeno o horario, o colaborador, o cliente, e o servico, eu gostaria de montar uma tabela onde:

 

|7:00|colaborador baiana|cliente beltrana|fazer pe|data tal

------------------------------------------------------------------------------

|7:30| | | |

------------------------------------------------------------------------------

|8:00| | | |

------------------------------------------------------------------------------

|8:30|colaborador baiana|cliente cicrana |fazer mao| data y

------------------------------------------------------------------------------

 

a sql q eu usei foi

 

SELECT * 
FROM agenda AS a, clientes AS cl, colaboradores AS co, servicos AS s, horarios AS h
WHERE a.clientes_fk = cl.idClientes
AND co.idColaboradores =1
AND a.horarios_fk = h.idHorarios
AND a.servico_fk = s.idServicos
LIMIT 0 , 30

 

retornou os dados certos, coloquei dados ficticios, mas eu gostaria de montar um datagrid de acordo la emcima...sem ter q recorrer a gambiarras no php (com flex/air)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo, então você quer todos os clientes, que tem serviços agendados, e os horários nem sempre são iguais, como 'ClienteA' pode ter um serviço marcado pra 7:30, logo '8:00' não tem ninguém .. é isso ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, q mesmo nao tenha ninguem ali nakele horario, a linha fique vazia, e listando todos os horarios...

 

Certo, aplica-se um LEFT JOIN .. veja

mysql> create schema salao ;
Query OK, 1 row affected (0.00 sec)

mysql> use salao ;
Database changed
mysql> create table clientes (
   ->         id integer not null auto_increment primary key ,
   ->        nome varchar ( 28 ) not null
   -> ) ;
Query OK, 0 rows affected (0.11 sec)

mysql> create table servicos (
   ->        sid integer not null auto_increment primary key ,
   ->       servico varchar ( 18 ) not null
   -> ) ;
Query OK, 0 rows affected (0.12 sec)

mysql> create table horarios (
   ->        hid integer not null auto_increment primary key ,
   ->       horario datetime not null
   -> ) ;
Query OK, 0 rows affected (0.07 sec)

mysql> create table servicosHorarios (
   ->       hid integer not null ,
   ->       sid integer not null ,
   ->       id integer not null
   -> ) ;
Query OK, 0 rows affected (0.11 sec)

mysql> insert into clientes values ( 1 , 'Luisa' ) ;
Query OK, 1 row affected (0.04 sec)

mysql> insert into servicos values
   -> ( 1 , 'Tratamento' ) ,
   -> ( 2 , 'Fazer as unhas' ) ;
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into horarios values
   -> ( 1 , '2012-02-20 17:00:00' ) ,
   -> ( 2 , '2012-02-20 15:00:00' ) ,
   -> ( 3 , '2012-02-20 18:00:00' ) ;
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> insert into servicosHorarios values
   -> ( 1 , 1 , 1 ) ,
   -> ( 3 , 2 , 1 ) ;
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select h.horario , clientes.nome , servicos.servico
   -> from horarios as h
   -> left join servicosHorarios as s on h.hid = s.hid
   -> left join clientes on clientes.id = s.id
   -> left join servicos on s.sid = servicos.sid ;
+---------------------+-------+----------------+
| horario             | nome  | servico        |
+---------------------+-------+----------------+
| 2012-02-20 17:00:00 | Luisa | Tratamento     |
| 2012-02-20 15:00:00 | NULL  | NULL           |
| 2012-02-20 18:00:00 | Luisa | Fazer as unhas |
+---------------------+-------+----------------+
3 rows in set (0.00 sec)

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

1-, tentei reproduzir e nao consegui,

2- eu preciso saber tb ekm vai atender o cliente, pois a recepcionista eh q recebe o telefonema e registra o atendimento futuro na agenda...

Compartilhar este post


Link para o post
Compartilhar em outros sites

1-, tentei reproduzir e nao consegui

Qual foi o problema.

 

2- eu preciso saber tb ekm vai atender o cliente, pois a recepcionista eh q recebe o telefonema e registra o atendimento futuro na agenda...

Certo .. e o que isso te impede de adicionar outro relacionamento ou pensar na possibilidade de fazer uma modelagem bacana !?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, qual modelagem você me sugere...?

 

bom, com mais calma tentei refazer o seu sql, mas nao deu certo...veja...

 


--
-- Estrutura da tabela `agenda`
--

CREATE TABLE IF NOT EXISTS `agenda` (
 `idAgenda` int(11) NOT NULL AUTO_INCREMENT,
 `servico_fk` int(11) DEFAULT NULL,
 `colaborador_fk` int(11) DEFAULT NULL,
 `clientes_fk` int(11) DEFAULT NULL,
 `horarios_fk` int(11) DEFAULT NULL,
 `data` varchar(45) DEFAULT NULL,
 PRIMARY KEY (`idAgenda`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Extraindo dados da tabela `agenda`
--

INSERT INTO `agenda` (`idAgenda`, `servico_fk`, `colaborador_fk`, `clientes_fk`, `horarios_fk`, `data`) VALUES
(1, 1, 1, 2, 5, NULL),
(2, 2, 1, 2, 2, NULL);

-- --------------------------------------------------------

--
-- Estrutura da tabela `clientes`
--

CREATE TABLE IF NOT EXISTS `clientes` (
 `idClientes` int(11) NOT NULL AUTO_INCREMENT,
 `cpf` varchar(15) DEFAULT NULL,
 `nome` varchar(245) NOT NULL,
 `email` varchar(245) DEFAULT NULL,
 `datanasc` varchar(10) DEFAULT NULL,
 `rua` varchar(245) DEFAULT NULL,
 `numero` varchar(5) DEFAULT NULL,
 `complemento` varchar(245) DEFAULT NULL,
 `bairro` varchar(245) DEFAULT NULL,
 `cidade` varchar(245) DEFAULT NULL,
 `Estados_fk` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`idClientes`,`Estados_fk`),
 KEY `fk_Clientes_Estados` (`Estados_fk`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Extraindo dados da tabela `clientes`
--

INSERT INTO `clientes` (`idClientes`, `cpf`, `nome`, `email`, `datanasc`, `rua`, `numero`, `complemento`, `bairro`, `cidade`, `Estados_fk`) VALUES
(1, NULL, 'nina', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0),
(2, NULL, 'baiana', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);

-- --------------------------------------------------------

--
-- Estrutura da tabela `colaboradores`
--

CREATE TABLE IF NOT EXISTS `colaboradores` (
 `idColaboradores` int(11) NOT NULL AUTO_INCREMENT,
 `cpf` varchar(15) DEFAULT NULL,
 `nome` varchar(245) NOT NULL,
 `email` varchar(245) DEFAULT NULL,
 `datanasc` varchar(10) DEFAULT NULL,
 `rua` varchar(245) DEFAULT NULL,
 `numero` varchar(5) DEFAULT NULL,
 `complemento` varchar(245) DEFAULT NULL,
 `bairro` varchar(245) DEFAULT NULL,
 `cidade` varchar(245) DEFAULT NULL,
 `Estados_fk` int(11) NOT NULL DEFAULT '0',
 PRIMARY KEY (`idColaboradores`,`Estados_fk`),
 KEY `fk_Clientes_Estados` (`Estados_fk`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

--
-- Extraindo dados da tabela `colaboradores`
--

INSERT INTO `colaboradores` (`idColaboradores`, `cpf`, `nome`, `email`, `datanasc`, `rua`, `numero`, `complemento`, `bairro`, `cidade`, `Estados_fk`) VALUES
(1, NULL, 'marcia', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0);

-- --------------------------------------------------------

--
-- Estrutura da tabela `estados`
--

CREATE TABLE IF NOT EXISTS `estados` (
 `idEstados` int(11) NOT NULL AUTO_INCREMENT,
 `sigla` varchar(45) DEFAULT NULL,
 PRIMARY KEY (`idEstados`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Estrutura da tabela `horarios`
--

CREATE TABLE IF NOT EXISTS `horarios` (
 `idHorarios` int(11) NOT NULL AUTO_INCREMENT,
 `horario` varchar(45) DEFAULT NULL,
 PRIMARY KEY (`idHorarios`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=7 ;

--
-- Extraindo dados da tabela `horarios`
--

INSERT INTO `horarios` (`idHorarios`, `horario`) VALUES
(1, '7:00'),
(2, '7:30'),
(3, '8:00'),
(4, '8:30'),
(5, '9:00'),
(6, '9:30');

-- --------------------------------------------------------

--
-- Estrutura da tabela `produtos`
--

CREATE TABLE IF NOT EXISTS `produtos` (
 `idProdutos` int(11) NOT NULL AUTO_INCREMENT,
 `nome` varchar(245) NOT NULL,
 `descricao` text,
 `valor` varchar(10) NOT NULL,
 PRIMARY KEY (`idProdutos`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Estrutura da tabela `servicos`
--

CREATE TABLE IF NOT EXISTS `servicos` (
 `idServicos` int(11) NOT NULL AUTO_INCREMENT,
 `servico` varchar(245) NOT NULL,
 `descricao` text,
 `valor` varchar(45) DEFAULT NULL,
 `status` char(1) DEFAULT NULL,
 PRIMARY KEY (`idServicos`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Extraindo dados da tabela `servicos`
--

INSERT INTO `servicos` (`idServicos`, `servico`, `descricao`, `valor`, `status`) VALUES
(1, 'pe', NULL, NULL, NULL),
(2, 'unha', NULL, NULL, NULL),
(3, 'cabelo', NULL, NULL, NULL);



-----consulta reproduzida e modificada
SELECT h.horario, clientes.nome, servicos.servico
FROM horarios AS h
LEFT  JOIN agenda AS s ON h.idHorarios = s.idAgenda
LEFT  JOIN clientes ON clientes.idClientes = s.idAgenda
LEFT  JOIN servicos ON s.servico_fk = servicos.idServicos
LIMIT 0 , 30



---resultado

horario nome servico   
	7:00 nina pe      	
	7:30 baiana unha   			
	8:00   NULL NULL
	8:30  NULL NULL
	9:00  NULL NULL
	9:30  NULL NULL

 

se olhar os dados nas tabelas, vera q tem gente no hrario errado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, agradeco sua atencao......esta agenda tem q ser vista pela recepcionista, q vai ver os servicos, horarios, clientes, colaboradores, e data, e tb sera visto pelo colaborador...

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.