Ir para conteúdo

POWERED BY:

Arquivado

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

rogerblower

Relacionamento em 3 tabelas

Recommended Posts

Pessoal peço ajuda para relacionamento entre três tabelas que criei e não consigo acertar o relacionamento o que preciso:

 

As três tabelas

 

orcamento

detalhe_orcamento

mao_obra

 

No formulário insiro dados na tabela orcamento pegando dados da mao_obra e insiro na detalhe_orcamento, tudo funciona, mas na hora de mostrar os dados não consigo pegar o orcamento_id que esta na detalhe_orcamento, tendo fazer o relacionamento via phpmyadmin e da erro segue as três tabelas

 

-- Estrutura da tabela `orcamento`
--

CREATE TABLE IF NOT EXISTS `orcamento` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `veiculo_id` int(4) NOT NULL,
  `cliente_id` int(4) NOT NULL,
  `funcio_id` int(11) NOT NULL,
  `data` text NOT NULL,
  `cond_pagamento` text NOT NULL,
  `qtdparcelas` text NOT NULL,
  `valorparcela` text NOT NULL,
  `datainicio` text NOT NULL,
  `datatermino` text NOT NULL,
  `validadeorcamento` text NOT NULL,
  `ativo` enum('0','1') NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `veiculo_id` (`veiculo_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=53 ;

--
-- RELATIONS FOR TABLE `orcamento`:
--   `veiculo_id`
--       `veiculos` -> `id`




-- Estrutura da tabela `detalhe_orcamento`
--

CREATE TABLE IF NOT EXISTS `detalhe_orcamento` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `orcamento_id` int(11) NOT NULL,
  `mao_obra_id` varchar(100) NOT NULL,
  `preco` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `mao_obra_id` (`mao_obra_id`),
  KEY `orcamento_id` (`orcamento_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=395 ;

--
-- RELATIONS FOR TABLE `detalhe_orcamento`:
--   `mao_obra_id`
--       `mao_obra` -> `id`




-- Estrutura da tabela `mao_obra`
--

CREATE TABLE IF NOT EXISTS `mao_obra` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mao_obra` text NOT NULL,
  `orcamento_id` int(11) NOT NULL,
  `preco` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `orcamento_id` (`orcamento_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=18 ;

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelo que eu entendi sua tabela central é a detalhe_orcamento.

Então segue abaixo o SQL, bas você alterar os campos que irão aparecer.

 

select a.id, a.preco, b.mao_obra, b.preco, c.id from detalhe_orcamento a
inner join mao_obra b on a.mao_obra_id = b.id
inner join orcamento c on a.orcamento_id = c.id
where a.id = 1;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro modelo depois defina as tabelas.

 

Orcamento_id existe em detalhe_orcamento e em mao_de_obra, nao entendi o motivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro modelo depois defina as tabelas. Orcamento_id existe em detalhe_orcamento e em mao_de_obra, nao entendi o motivo.

 

Eu fiquei confuso com isso também kkk, mas eu consegui chegar naquele modelo, mas não sei se está certo com o raciocínio dele

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que o rogerblower cometeu o erro de criar as tabelas sem modelar antes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fagundes, sim a detalhe_orcamento recebe dados da orcamento e mao_obra

 

Motta e Fagundes essa duvida de vocês, foi porque coloquei o orcamento_id para testar ma também nao deu certo e esqueci de tirar

 

Fagundes, testei a consulta e não apareceu nada de resultado



Creio que o rogerblower cometeu o erro de criar as tabelas sem modelar antes.

 

Motta não modelei tabelas fui criando conforme iam me surgindo as necessidades, poderia me explicar como modelar tabelas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloca o left no lugar de algum inner e veja o que esta faltando.

 

select a.id, a.preco, b.mao_obra, b.preco, c.id from detalhe_orcamento a
left join mao_obra b on a.mao_obra_id = b.id
inner join orcamento c on a.orcamento_id = c.id
where a.id = 1;

 

Se isso te retornar algo, é porque o registro da tabela mao_obra não existe.

 

select a.id, a.preco, b.mao_obra, b.preco, c.id from detalhe_orcamento a
inner join mao_obra b on a.mao_obra_id = b.id
left join orcamento c on a.orcamento_id = c.id
where a.id = 1;

Se isso retornar algo, é porque o registro da tabela orcamento não existe.

 

select a.id, a.preco, b.mao_obra, b.preco, c.id from detalhe_orcamento a
left join mao_obra b on a.mao_obra_id = b.id
left join orcamento c on a.orcamento_id = c.id
where a.id = 1;

Agora se você colocar isso e não retornar nada é porque não existe registro em lugar nenhum.

 

Obs: Creio que você alterou a clausula where de acordo com sua necessidade...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fagundes consegui fazer a consulta dessa forma

 

$sql = ("SELECT detalhe_orcamento.orcamento_id, detalhe_orcamento.mao_obra_id, mao_obra.preco, mao_obra.mao_obra FROM detalhe_orcamento
INNER JOIN orcamento ON orcamento.id = detalhe_orcamento.orcamento_id
INNER JOIN mao_obra ON mao_obra.id = detalhe_orcamento.mao_obra_id ORDER BY detalhe_orcamento.orcamento_id") or die (mysql_error());

 

O resultado foi esse:

orcamento_id mao_obra_id mao_obra preco 51 17 Parachoque trazeiro R$ 300,00

PS: Só não vão dizer que meu preço esta caro :)

 

a que você postou acima ainda não testei

 

Como vocês notaram não sou programador estou desenvolvendo o sistema para meu próprio uso Lembrando que estou "ignorando" o id da tabela detalhe_orcamento,

Compartilhar este post


Link para o post
Compartilhar em outros sites

A única diferença que estou notando ai é que você não usou a clausula where

mas que bom que conseguiu.

Qualquer coisa estamos ai, não esqueça de colocar o tópico como resolvido quando for solucionada a sua dúvida...

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.