Ir para conteúdo

POWERED BY:

Arquivado

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

Henrique Zanini

[Resolvido] Problema relacionamento de tabelas - where

Recommended Posts

Galera, tudo bem? Estou tentando fazer um relacionamento de tabelas para mostrar o saldo atual de uma conta bancária.

 

Tenho três tabelas (tbl_receita, tbl_despesas, tbl_conta);

 

Consegui fazer o relacionamento certinho, somando e diminuindo os dados:

 

<?php
$sql = mysql_query("SELECT *, SUM(r.valor_receita) as somaReceita, SUM(d.valor_despesa) as somaDespesa
FROM tbl_conta c
LEFT JOIN tbl_receita r on r.conta_receita = c.id_conta
LEFT JOIN tbl_despesas d on d.conta_despesa = c.id_conta
GROUP BY c.id_conta ORDER BY c.nome_conta ASC");
?>

 

Dessa forma funcionou, consegui exibir o nome de todas as contas e o valor. O problema é que em ambas as tabelas tenho um campo "situacao - enum('s','n')";

 

Como faço para colocar um WHERE no Sql, para que ele some diminua somente o que já está com 's'?

 

Espero que eu tenha deixado claro minha dúvida :s

 

obrigado.

 

Tem alguma forma de denifir o where somente para um tabela? ou no próprio sum colocar um where? :s

 

Me disseram que talvez devesse fazer com case when, nunca usei :/ alguém tem alguma dica? :s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

 

O que você quer fazer exatamente ? eu não entendi.

Se a situação for "S" irá diminuir o que ? e caso não for irá somar o que ?

 

Ou você quer apenas filtrar todos que a situação está em "S" ?

Desculpe, não entendi mesmo.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas respostas.

 

Eu gostaria de somar somente se situacao = 's' (no caso da tbl_receita se já tiver recebido e na tbl_despesa se já tiver pago).

 

como se fosse WHERE r.situacao = 's' AND d.situacao = 's';

 

Só que dessa forma não dá certo :/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se colocar o where da forma que eu disse, não acontece erro nenhum, porém, não funciona. Não aparece nada. Talvez eu esteja montando o where errado, ou existe alguma outra forma de fazer isso?

 

Obrigado

 

Mais alguma dica? Tem algum link pra eu entender como funciona o "cas when" e o "sum"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

SUM

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html

 

CASE

http://dev.mysql.com/doc/refman/5.0/en/case.html

 

 

Se você adicionou o WHERE e não deu erro, porém não trouxe nenhum resultado, significa que não tinha nenhum valor correspondente a busca que você fez.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pode fazer sim. Mas o motivo de não ter dado nenhum resultado, é que nenhum resultado se encaixa com oque você pediu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

meu código está assim:

$sql = mysql_query("SELECT *, SUM(r.valor_receita) as somaReceita, SUM(d.valor_despesa) as somaDespesa
FROM tbl_conta c
LEFT JOIN tbl_receita r on r.conta_receita = c.id_conta
LEFT JOIN tbl_despesas d on d.conta_despesa = c.id_conta
WHERE r.situacao_receita = 's' AND d.situacao_despesa = 's'
GROUP BY c.id_conta
ORDER BY c.nome_conta ASC") or die(mysql_error());

 

minhas tbl_receita:

id_receita | valor_receita | situacao_receita

1 | 10.00 | s

2 | 10.00 | n

 

tbl_despesas:

id_despesa | valor_despesa | situacao_despesa

1 | 5.00 | s

 

Existe o valor e está com a situação 's' como no where.

 

Sem o where, aparece o nome das contas bancárias (na tbl_contas) e soma os resultados, porém, ele faz a soma de tudo (contas ainda não recebidas e ainda não pagas) por isso a importância de usar o where :s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra que o SELECT * ?

Se você sabe o que tem que mostrar na consulta, especifique.

 

Estive testando o seu select e de fato algo acontece. Provavelmente, para o seu modelo de dados, você vai ter que fazer subselects para totalizar as receitas e despesas.

 

Se quiser, poste o modelo para as 3 tabelas envolvidas na consulta.

 

-----

Edit: Complemento da resposta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra que o SELECT * ?

Se você sabe o que tem que mostrar na consulta, especifique.

 

Estive testando o seu select e de fato algo acontece. Provavelmente, para o seu modelo de dados, você vai ter que fazer subselects para totalizar as receitas e despesas.

 

Se quiser, poste o modelo para as 3 tabelas envolvidas na consulta.

 

-----

Edit: Complemento da resposta.

 

Dessa forma?

 

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

--
-- Estrutura da tabela `tbl_conta`
--


CREATE TABLE IF NOT EXISTS `tbl_conta` (
 `id_conta` int(11) NOT NULL AUTO_INCREMENT,
 `nome_conta` varchar(200) NOT NULL,
 PRIMARY KEY (`id_conta`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=8 ;



--
-- Extraindo dados da tabela `tbl_conta`
--



INSERT INTO `tbl_conta` (`id_conta`, `nome_conta`) VALUES
(1, 'Banco do Brasil'),
(2, 'Tesouraria (Caixinha)'),
(4, 'Sicoob'),
(5, 'Bradesco'),
(7, 'Santander');

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

--
-- Estrutura da tabela `tbl_despesas`
--


CREATE TABLE IF NOT EXISTS `tbl_despesas` (
 `id_despesa` int(11) NOT NULL AUTO_INCREMENT,
 `valor_despesa` decimal(10,2) NOT NULL,
 `descricao_despesa` varchar(200) NOT NULL,
 `categoria_despesa` int(11) NOT NULL,
 `data_de_vencimento_despesa` date NOT NULL,
 `total_parcelas_despesa` int(11) NOT NULL,
 `n_da_parcela_despesas` int(11) NOT NULL,
 `conta_despesa` int(1) NOT NULL,
 `situacao_despesa` enum('s','n') NOT NULL,
 `fornecedor_despesa` int(11) NOT NULL,
 `centro_de_custo_despesa` varchar(11) NOT NULL,
 `parent_id_despesas` int(11) NOT NULL,
 `responsavel_cadastro_despesa` varchar(25) NOT NULL,
 `data_cadastro_despesa` date NOT NULL,
 `hora_cadastro_despesa` varchar(5) NOT NULL,
 PRIMARY KEY (`id_despesa`),
 KEY `chave_estrang_conta` (`conta_despesa`),
 KEY `chave_estrang_categoria` (`categoria_despesa`),
 KEY `chave_estrang_centro_de_custo` (`centro_de_custo_despesa`),
 KEY `chave_estrang_fornecedor` (`fornecedor_despesa`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=80 ;



--
-- Extraindo dados da tabela `tbl_despesas`
--

INSERT INTO `tbl_despesas` (`id_despesa`, `valor_despesa`, `descricao_despesa`, `categoria_despesa`, `data_de_vencimento_despesa`, `total_parcelas_despesa`, `n_da_parcela_despesas`, `conta_despesa`, `situacao_despesa`, `fornecedor_despesa`, `centro_de_custo_despesa`, `parent_id_despesas`, `responsavel_cadastro_despesa`, `data_cadastro_despesa`, `hora_cadastro_despesa`) VALUES
(77, 5.00, 'teste 1', 1, '2012-09-28', 1, 1, 1, 's', 1, '1', 1, 'Henrique Zanini', '2012-09-28', '14h46'),
(78, 10.00, 'teste', 1, '2012-10-03', 1, 1, 1, 's', 6, '', 78, 'Henrique Zanini', '2012-10-03', '10h48'),
(79, 5.00, 'teste novo', 20, '2012-10-03', 1, 1, 1, 'n', 6, '', 79, 'Henrique Zanini', '2012-10-03', '10h53');



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

--
-- Estrutura da tabela `tbl_receita`
--


CREATE TABLE IF NOT EXISTS `tbl_receita` (
 `id_receita` int(11) NOT NULL AUTO_INCREMENT,
 `valor_receita` decimal(10,2) NOT NULL,
 `descricao_receita` varchar(25) NOT NULL,
 `categoria_receita` varchar(20) NOT NULL,
 `data_vencimento_receita` date NOT NULL,
 `total_parcelas_receita` int(11) NOT NULL,
 `n_da_parcela_receita` int(11) NOT NULL,
 `conta_receita` varchar(20) NOT NULL,
 `situacao_receita` enum('s','n') NOT NULL,
 `cliente_receita` int(11) NOT NULL,
 `centro_de_custo_receita` varchar(20) NOT NULL,
 `parent_id_receita` int(11) NOT NULL,
 `usuario_responsavel_cadastro_receita` varchar(20) NOT NULL,
 `data_cadastro_receita` date NOT NULL,
 `horario_cadastro_receita` varchar(5) NOT NULL,
 PRIMARY KEY (`id_receita`),
 KEY `chave_estrangeira_clientes` (`cliente_receita`),
 KEY `chave_estrang_categoria` (`categoria_receita`),
 KEY `chave_estrang_centro_de_custo` (`centro_de_custo_receita`),
 KEY `chave_estrang_conta` (`conta_receita`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=30 ;



--
-- Extraindo dados da tabela `tbl_receita`
--



INSERT INTO `tbl_receita` (`id_receita`, `valor_receita`, `descricao_receita`, `categoria_receita`, `data_vencimento_receita`, `total_parcelas_receita`, `n_da_parcela_receita`, `conta_receita`, `situacao_receita`, `cliente_receita`, `centro_de_custo_receita`, `parent_id_receita`, `usuario_responsavel_cadastro_receita`, `data_cadastro_receita`, `horario_cadastro_receita`) VALUES
(29, 10.00, 'teste  2', '2', '2012-09-28', 1, 1, '1', 's', 1, '1', 2, 'Henrique Zanini', '2012-09-28', '11h47'),
(28, 10.00, 'Teste', '1', '2012-09-28', 1, 1, '1', 'n', 1, '1', 1, 'Henrique Zanini', '2012-09-28', '11h46');

 

Obrigado pelas respostas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consegui com 1 select, apenas com subselects...

 

SELECT *, 
COALESCE((SELECT SUM(valor_receita) FROM tbl_receita WHERE conta_receita = c.id_conta AND situacao_receita = 's'),0) as somaReceita, 
COALESCE((SELECT SUM(valor_despesa) FROM tbl_despesas WHERE conta_despesa = c.id_conta AND situacao_despesa = 's'),0) as somaDespesa 
FROM tbl_conta c
ORDER BY nome_conta ASC

 

Há algum problema com o seu modelo ou com a nossa lógica... Rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não consegui com 1 select, apenas com subselects...

 

SELECT *, 
COALESCE((SELECT SUM(valor_receita) FROM tbl_receita WHERE conta_receita = c.id_conta AND situacao_receita = 's'),0) as somaReceita, 
COALESCE((SELECT SUM(valor_despesa) FROM tbl_despesas WHERE conta_despesa = c.id_conta AND situacao_despesa = 's'),0) as somaDespesa 
FROM tbl_conta c
ORDER BY nome_conta ASC

 

Há algum problema com o seu modelo ou com a nossa lógica... Rs

 

Muito bom, muito bom mesmo! Obrigado pela resposta, eu não sabia da possibilidade de fazer subselects.. Obrigado mesmo.

Tópico resolvido!

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.