Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Espero que possam me ajudar, segue a explicação o mais detalhada que consigo fazer!
Tenho um sql que lista os produtos assim
SEM O GROUP BY
COM O GROUP BY
Preciso que o codigo exiba na tela como quando está com o group by, porém também preciso que ele não desconsidere as demais entradas com o mesmo nome.
Por exemplo o produto Coca Cola fardo 6x2L(Entrada) se existirem 2 entradas e uma saida ele exiba na mesma linha o total de entradas e saidas, por que afinal são o mesmo produto. e preciso controlar o balanço de entradas e saidas para poder fazer o calculo final de balanço mensal.
Abaixo os prints da tela na web, da tabela produtos e da tabela entrada. Aparentemente está funcionando a parte de somar todas as entradas do mesmo produto que estejam como tipo entrada e somar a quantidade,na coluna ao lado dela deveria ocorrer o mesmo, porém com as saidas, só que se eu não estou conseguindo, e por isso deletei esse codigo com erros.
De acordo com o bd na coluna saidas em Dolly deveria estar 20 e em p1 e p2 0.
Como eu consigo fazer isso?
$produtos = "SELECT produtos.*, entrada.produto, SUM(entrada.qt), entrada.tipo FROM produtos
INNER JOIN entrada ON entrada.produto = produtos.nome
WHERE entrada.tipo = 'entrada'
GROUP BY entrada.produto";
$result = mysql_query($produtos) or die(mysql_error());
// Descobrimos o total de registros encontrados
$numRegistros = mysql_query($produtos) or die(mysql_error());
// Se houver pelo menos um registro, exibe-o
if ($numRegistros != 0) {
// Exibe os resultados da pesquisa
while($row = mysql_fetch_assoc($result)){
echo "
<tr>
<td>". $row['usuario']. "</td>
<td>". $row['nome']. "</td>
<td>R$". $row['custo']. "</td>
<td>". $row['SUM(entrada.qt)']."</td>
<td></td>
<td>". $row['quantidade']."</td>
<td> </td>
<td> ". $row['data']. "</td>
Tabela produtos:
Tabela entrada
Oi Obrigada por ajudar!!!!
Fiz essa alteração que você sugeriu, e após colocar o codigo assim na hora que executa o sistema não retorna valor nenhum.
$produtos = "
SELECT
produtos.nome,
entrada.tipo,
SUM(entrada.qt) AS entrada,
SUM(saida.qt) AS saida,
produtos.usuario,
entrada.produtose eu removo a linha
SUM(saida.qt) AS saida,
e a linha
INNER JOIN entrada AS saida ON (entrada.produto = produtos.nome AND entrada.tipo = 'saida')
ele me retorna os demais valores.
não acontece erro nenhum, e não sei para onde ir rsrsrsrs, será que poderia me explicar isso que não compreendi
a linha que estiver como "tipo saida" na tabela "entrada" virará o parametro saida da linha "SUM(saida.qt) AS saida, " ou esse saida em vermelho se refere a uma nova tabela que devo fazer para cadastrar apenas as saídas?
Será que expliquei bem? está meio confuso isso!
Obrigada!
Vi que eu havia feito um erro no join, corrigi lá em cima e estou adicionando novamente aqui embaixo:
SELECT
produtos.nome,
SUM(entrada.qt) AS entrada,
SUM(saida.qt) AS saida
FROM
produtos
INNER JOIN entrada ON (entrada.produto = produtos.nome AND entrada.tipo = 'entrada')
INNER JOIN entrada AS saida ON (saida.produto = produtos.nome AND saida.tipo = 'saida')
GROUP BY
produto.nome
Na sua consulta, você precisa adicionar os campos que não usam aggregate functions no group by. Outro detalhe, teste sua query diretamente no MySQL, pode ser no PHPMyAdmin mesmo.
Por que está retornando o tipo da movimentação (sendo que agora estão sendo mostradas ambas na mesma linha) e o produto da tabela entrada.produto (sendo que entrada.produto é igual produto.nome)?
[...]a linha que estiver como "tipo saida" na tabela "entrada" virará o parametro saida da linha "SUM(saida.qt) AS saida, " ou esse saida em vermelho se refere a uma nova tabela que devo fazer para cadastrar apenas as saídas?[...]
É apenas um apelido (alias) da tabela para evitar conflito entre os joins. Como você já está fazendo o join para mostrar a entrada, foi adicionado outro join para mostrar a saída. Como você está registrando a movimentação na mesma tabela, apenas diferenciando o tipo (entrada/saída), deve ser feito dois joins com a mesma tabela, um para entrada e outro para saída. E como não pode repetir os nomes, foi adicionado um alias para a saída.
Muito obrigada Gabriel!!!!! Tive uma reviravolta aqui, com sua explicação do join eu criei uma nova tabela só que ela se chama "saida" e é igualzinha a tabela "entrada". (OBs. Você acha burrada fazer assim?)
coloquei o join para puxar da tabela saida e parecia que havia funcionado.
Também achei um erro, na hora de cadastrar um produto com nome composto na tabela produtos ele cadastra o nome composto certinho, já na hora da entrada e saida ele só puxa o primeiro nome do produto.
$valores = split(' ',$_POST['product_nome']);
$nome = $valores[1];
$id = $valores[0];
$quantidade = trim($_POST['quantidade']);
$usuario = $_SESSION['id_usuario'];
$nome_usuario = $_SESSION['usuario'];
no codigo acima, não estou conseguindo fazer o bendito do codigo, puxar tudo o que for escrito depois de $valores[0].
SOCORRO!
Devo postar aqui o codigo que funcionou pra mim, para outros usuarios poderem ver também?
OBS. Não sei direito ao que se se refere com o aggregate functions, é o while? Desculpa, não sei!
[...]Você acha burrada fazer assim?[...]
Bom, não é uma questão de achar... Tanto entrada quanto saída, são movimentações de estoque. É aconselhável que se tenha uma tabela que registre a movimentação. "Cheira ainda pior" por serem duas tabelas com a mesma estrutura, logo, não se faz nenhum sentido serem tabelas separadas.
>
coloquei o join para puxar da tabela saida e funcionou, só que achei um erro, na hora de cadastrar um produto com nome composto na tabela produtos ele cadastra o nome composto certinho, já na hora da entrada e saida ele só puxa o primeiro nome do produto.
$valores = split(' ',$_POST['product_nome']);
$nome = $valores[1];
$id = $valores[0];
$quantidade = trim($_POST['quantidade']);
$usuario = $_SESSION['id_usuario'];
$nome_usuario = $_SESSION['usuario'];
no codigo acima, não estou conseguindo fazer o bendito do codigo, puxar tudo o que for escrito depois de $valores[0].
Acredito que isso esteja atrelado a chave estrangeira que está usando. Você está usando o nome produto como chave estrangeira. Se mudar o nome, bem, lá se vai teu estoque. Mesmo que o produto seja único, considere utilizar surrogate keys.
Mas, pelo seu código, nome completo do produto está em: $_POST['product_nome']
Está funcionando certinho seu código, deixei tudo em uma tabela só, tanto entradas e saídas, e até agora funciona!!! Você é um gênio!!!! rsrsrsrs
Notei que o valor das saídas dobra se eu edito o valor de saída diretamente pelo phpmyadmim (estranho isso!!!) Se lanço a saida pelo site que fiz ele registra certo.
Bom agora vamos a outra parte q você me esclareceu.
Eu lancei um:
$valores = split(' ',$_POST['product_nome']);
pois a variavel product_nome ppuxa o nome completo do produto acrescido de seu id único, que é automaticamente preenchido em um select com sql assim na página anterior:
<?php
#seleciona os dados da tabela produto
$query = mysql_query("SELECT id, nome, usuario FROM produtos WHERE IdDoUsuario = ".$_SESSION['id_usuario']." ORDER BY id ASC");
?>
<p>Selecione um produto</p>
<select name="product_nome" id="product_nome" >
<option >Selecione...</option>
<?php while($prod = mysql_fetch_array($query)) { ?>
<option value="<?php echo $prod['id'] ?> <?php echo $prod['nome'] ?>" > <?php echo $prod['id'] ?> - <?php echo $prod['nome'] ?></option>
<?php } ?>
</select>
O codigo funciona bem, só que ele só pega a variavel:
$valores[0]; que é o id e depois do espaço ele pega o primeiro nome q é $valores[1];.
Já coloquei pra ele puxar $valores[2]; , $valores[3]; , e funciona para nomes compostos, só que como cada pessoa pode cadastrar um produto com uma gama enorme de nomes compostos, eu gostaria que a split pegasse todos os valores que estão depois do espaço, e não somente a primeira.
$valores = split(' ',$_POST['product_nome']);
$id = $valores[0];
$nome = $valores[1];
se não vou ter que colocar
$nome2 = $id = $valores[2];
$nome3 = $id = $valores[3];
$nome4 = $id = $valores[4];
$nome5 = $id = $valores[5];
e assim por diante.
Consegui corrigir Gabriel, coloquei como separador um hífen e fiz com que os valores fossem divididos não por espaços , mais sim pelo hífen, assim, o sistema me retornou como código do produto tudo que estava antes do hífen e como nome td que estava após o hífen.
Simples assim!!
Eu vacilei legal nisso, pq não era nem falta de código e sim falta de pensar mesmo! rsrsrsrs
Achei um erro. alterei o nome da tabela entrada para historico, OK...
Achei o seguinte problema, cadastrei o produto guarana, e funcionou certinho, e tb o adicionou ao estoque certinho. Se eu cadastro uma nova venda ou compra do produto eu fiz com que o sistema fizesse um update na tabela produtos somando ou subitraindo sua quantidade assim:
$sql = mysql_query("UPDATE produtos SET quantidade = quantidade-$quantidade WHERE id = '{$id}'")
or die( mysql_error() );
e até ai funciona correto, porém depois desse update , (tanto para entrada ou saida) se eu havia lançado no estoque por exemplo 80 guaranás na coluna entrada ele mostra 160 entradas sendo que são só 80, e se eu lanço mais um update de saida ele aumenta mais 80 de novo.
no print abaixo cadastrei guarana lata com 80 unidades de estoque, e lancei em seguida uma saida de 40 latas e em seguida mais uma com 1 lata, foram 2 updates então ficou 240 itens na entrada que é (80 + 80 + 80) O que há de errado agora? Tudo parecia funcionar bem!
OBS pelo phpmyadmin aparece 80 em entradas mesmo.
Só um lembrete, funções tipo Mysql_ estão obsoletas, e bom logo substituir por Mysqli oo PDO, para mais tarde nao ter de refazer todas as consultas.
Como ficou a consulta final para mostrar a quantidade de produtos?
Ps.: Conforme o icarof comentou, as funções mysql_* estão obsoletas, devem ser substituídas por outras.
$produtos = "SELECT
produtos.nome,
produtos.id,
SUM(historico.qt) AS entrada,
SUM(saida.qt) AS saida,
historico.produto,
historico.id_produto,
historico.tipo,
historico.data,
produtos.usuario,
produtos.custo,
produtos.quantidade
FROM
produtos
INNER JOIN historico ON (historico.id_produto = produtos.id AND historico.tipo = 'entrada')
INNER JOIN historico AS saida ON (saida.id_produto = produtos.id AND saida.tipo = 'saida')
WHERE
produtos.usuario LIKE '$usuario'
GROUP BY
historico.produto";
$result = mysql_query($produtos) or die(mysql_error());
// Descobrimos o total de registros encontrados
$numRegistros = mysql_query($produtos) or die(mysql_error());
// Se houver pelo menos um registro, exibe-o
if ($numRegistros != 0) {
// Exibe os resultados da pesquisa
while($row = mysql_fetch_assoc($result)){
echo "
<tr>
<td>". $row['usuario']. "</td>
<td>". $row['nome']. "</td>
<td>R$". $row['custo']. "</td>
<td>". $row['entrada']."</td>
<td>". $row['saida']. "</td>
<td>". $row['quantidade']. "</td>
<td> ". $row['custo'] * $row['entrada']. " </td>
<td> ". $row['data']. "</td>
Acima é o código que lê dobrado o valor que está no banco de dados em entrada e vi que em saída, o erro ocorre tb, só não captei depois de que ação que ocorre, mais o valor fica dobrado também.
e abaixo o código da pagina que incluí um novo produto ao estoque e no que excluí, a única diferença é que ao invés de sinal de + é um de -.
$sql = mysql_query("
UPDATE
produtos SET quantidade = quantidade+$quantidade WHERE id = '{$id}'")
or die( mysql_error() );
$sql = mysql_query("
INSERT INTO
historico (tipo, id_usuario, usuario, id_produto, produto, qt, data)A única coisa que vejo é a falta dos demais campos na cláusula group by. As funções de agregação (SUM no seu caso) exigem que os demais campos sejam adicionados a cláusula group by.
Faça o seguinte, minimize ao máximo a sua query, e tente consultar diretamente no PHPMyAdmin, veja se o resultado sai correto:
SELECT
produtos.nome,
produtos.id,
SUM(historico.qt) AS entrada,
SUM(saida.qt) AS saida,
produtos.quantidade
FROM
produtos
INNER JOIN historico ON (historico.id_produto = produtos.id AND historico.tipo = 'entrada')
INNER JOIN historico AS saida ON (saida.id_produto = produtos.id AND saida.tipo = 'saida')
WHERE
produtos.usuario LIKE '$usuario'
GROUP BY
produtos.nome,
produtos.id,
produtos.quantidade
Caso ocorrer o mesmo problema, é possível que o histórico esteja sendo duplicado ao inserir.
Caso não ocorra inconsistência, vá adicionando campo a campo até encontrá-la.
Gabriel, obrigada, tentei e não adiantou ainda essa sua sugestão.
Encontrei um padrão para o erro, acredito que falte alguma coisa no JOIN ou no SUM
Em entradas o valor da coluna "quantidade" é multiplicado pela quantidade de linhas de produto com o mesmo id porém com a coluna "tipo" com valor "saida".
Favor, poste as DDLs das duas tabelas (produto , histórico).
Dlls? Não sei o q eh isso. Como consigo?
DDL – Data Definition Language ( DDL) são usadas para definir a estrutura de banco de dados ou esquema.
Alguns exemplos:
*CREATE*- para criar objetos no banco de dados;
*ALTER *– altera a estrutura da base de dados;
*TRUNCATE* – remover todos os registros de uma tabela, incluindo todos os espaços alocados para os registros são removidos;
*COMMENT* – adicionar comentários ao dicionário de dados;
RENAME – para renomear um objeto.
-- phpMyAdmin SQL Dump
-- version 4.0.10.14
-- http://www.phpmyadmin.net
--
-- Servidor: localhost:3306
-- Tempo de Geração: 07/11/2016 às 12:26
-- Versão do servidor: 5.6.33-log
-- Versão do PHP: 5.6.20
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Banco de dados: kankarat_teste
--
-- --------------------------------------------------------
--
-- Estrutura para tabela estados
--
CREATE TABLE IF NOT EXISTS `estados` (
`id_estado` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`uf` char(2) NOT NULL,
`estado` varchar(19) NOT NULL,
PRIMARY KEY (`id_estado`),
UNIQUE KEY `estado` (`estado`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ;
--
-- Fazendo dump de dados para tabela estados
--
INSERT INTO estados (id_estado, uf, estado) VALUES
(1, 'AC', 'Acre'),
(2, 'AL', 'Alagoas'),
(3, 'AP', 'Amapá'),
(4, 'AM', 'Amazonas'),
(5, 'BA', 'Bahia'),
(6, 'CE', 'Ceará'),
(7, 'DF', 'Distrito Federal'),
(8, 'ES', 'Espirito Santo'),
(9, 'GO', 'Goiás'),
(10, 'MA', 'Maranhão'),
(11, 'MT', 'Mato Grosso'),
(12, 'MS', 'Mato Grosso do Sul'),
(13, 'MG', 'Minas Gerais'),
(14, 'PA', 'Pará'),
(15, 'PB', 'Paraíba'),
(16, 'PR', 'Paraná'),
(17, 'PE', 'Pernambuco'),
(18, 'PI', 'Piauí'),
(19, 'RN', 'Rio Grande do Norte'),
(20, 'RS', 'Rio Grande do Sul'),
(21, 'RJ', 'Rio de Janeiro'),
(22, 'RO', 'Rondônia'),
(23, 'RR', 'Roraima'),
(24, 'SC', 'Santa Catarina'),
(25, 'SP', 'São Paulo'),
(26, 'SE', 'Sergipe'),
(27, 'TO', 'Tocantins');
-- --------------------------------------------------------
--
-- Estrutura para tabela fornecedores
--
CREATE TABLE IF NOT EXISTS `fornecedores` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) NOT NULL,
`endereço` varchar(100) NOT NULL,
`telefone` varchar(14) NOT NULL,
`email` varchar(50) NOT NULL,
`CNPJ` varchar(30) NOT NULL,
`IdDoUsuario` int(11) NOT NULL,
`Usuario` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
--
-- Fazendo dump de dados para tabela fornecedores
--
INSERT INTO fornecedores (id, nome, endereço, telefone, email, CNPJ, IdDoUsuario, Usuario) VALUES
(1, 'Loja de doces da Sofia', 'rua de não sei 76', '2222-2222', 'sofia@sofiadoces.com.br', '00000000000000000', 7, 'gretelferraz'),
(2, 'bar do João', 'rua do paiu 44', '2222-2222', 'joao@joao.com.br', '000000000000', 7, 'gretelferraz'),
(4, 'bar do tio lu', 'rua do paiu 44', '2222-2222', 'lu@lu.com.br', '000000000000', 1, 'LARA'),
(5, 'bar primeiro gole', 'rua do paiu 44', '2222-2222', 'lu@lu.com.br', '000000000000', 7, 'gretelferraz'),
(6, 'Malu Doces', 'rua da Imaginação', '22 2222-2222', 'malu@malu.com.br', '22.222.222/2222-22', 7, 'gretelferraz'),
(7, '000', '000', '00 0000-0000', '0000000000000', '00.000.000/0000-00', 7, 'gretelferraz'),
(8, 'Loja 1', 'Rua 1', '11 1122-2111', 'Loja1@loja.com', '00.000.000/0000-00', 63, 'gretel'),
(9, 'malu doces', 'rua da malu', '99 9999-9999', 'gretel', '00.000.000/0000-00', 63, 'gretel'),
(10, 'bar do luiz', 'rua do luiz', '99 9999-9999', 'email', '00.000.000/0000-00', 63, 'gretel');
-- --------------------------------------------------------
--
-- Estrutura para tabela historico
--
CREATE TABLE IF NOT EXISTS `historico` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tipo` varchar(50) NOT NULL,
`id_usuario` int(11) NOT NULL,
`usuario` varchar(50) NOT NULL,
`id_produto` int(11) NOT NULL,
`produto` varchar(50) NOT NULL,
`qt` int(11) NOT NULL,
`data` date NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=71 ;
--
-- Fazendo dump de dados para tabela historico
--
INSERT INTO historico (id, tipo, id_usuario, usuario, id_produto, produto, qt, data) VALUES
(51, 'entrada', 7, 'gretelferraz', 19, 'refri', 10, '2016-10-25'),
(50, 'saida', 7, 'gretelferraz', 18, 'Guaraná lata 350ml', 1, '2016-10-25'),
(48, 'entrada', 7, 'gretelferraz', 18, 'Guaraná lata 350ml', 80, '2016-10-25'),
(49, 'saida', 7, 'gretelferraz', 18, 'Guaraná lata 350ml', 40, '2016-10-25'),
(47, 'entrada', 7, 'gretelferraz', 17, 'Fanta 2L', 50, '2016-10-25'),
(68, 'saida', 7, 'gretelferraz', 20, 'Coca Cola', 1, '2016-10-26'),
(62, 'saida', 7, 'gretelferraz', 19, 'refri', 10, '2016-10-25'),
(70, 'entrada', 7, 'gretelferraz', 19, 'refri', 1, '2016-10-25'),
(65, 'entrada', 7, 'gretelferraz', 20, 'Coca Cola', 10, '2016-10-26'),
(69, 'entrada', 7, 'gretelferraz', 20, 'Coca Cola', 20, '2016-10-26');
-- --------------------------------------------------------
--
-- Estrutura para tabela produtos
--
CREATE TABLE IF NOT EXISTS `produtos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(50) NOT NULL,
`quantidade` int(11) NOT NULL,
`custo` varchar(50) NOT NULL,
`preço` varchar(50) NOT NULL,
`IdDoUsuario` int(11) NOT NULL,
`usuario` varchar(50) NOT NULL,
`fornecedor` varchar(100) NOT NULL,
`data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;
--
-- Fazendo dump de dados para tabela produtos
--
INSERT INTO produtos (id, nome, quantidade, custo, preço, IdDoUsuario, usuario, fornecedor, data) VALUES
(19, 'refri', 0, '5,00', '6,00', 7, 'gretelferraz', '5 bar primeiro gole', '2016-10-26 18:17:29'),
(18, 'Guaraná lata 350ml', 39, '2,50', '5,00', 7, 'gretelferraz', '6 Malu Doces', '2016-10-25 03:04:10'),
(17, 'Fanta 2L', 50, '5,50', '8,50', 7, 'gretelferraz', '5 bar primeiro gole', '2016-10-25 03:01:10'),
(20, 'Coca Cola', 12, '5,50', '8,50', 7, 'gretelferraz', '1 Loja de doces da Sofia', '2016-10-26 18:06:44');
-- --------------------------------------------------------
--
-- Estrutura para tabela usuarios
--
CREATE TABLE IF NOT EXISTS `usuarios` (
`id_usuario` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`nome` varchar(45) NOT NULL,
`nivel_usuario` enum('0','1','2') NOT NULL DEFAULT '0',
`empresa` varchar(50) NOT NULL,
`CNPJ` varchar(100) NOT NULL,
`email` varchar(64) NOT NULL,
`telefone` varchar(14) NOT NULL,
`celular` varchar(14) NOT NULL,
`endereco` varchar(100) NOT NULL,
`num` varchar(11) NOT NULL,
`bairro` varchar(20) NOT NULL,
`cidade` varchar(45) NOT NULL,
`estado` varchar(30) NOT NULL,
`usuario` varchar(40) NOT NULL,
`senha` char(32) NOT NULL,
`data_cadastro` datetime NOT NULL,
`data_ultimo_login` datetime NOT NULL,
`ativado` int(11) NOT NULL,
PRIMARY KEY (`id_usuario`),
UNIQUE KEY `email` (`email`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=66 ;
--
-- Fazendo dump de dados para tabela usuarios
--
INSERT INTO usuarios (id_usuario, nome, nivel_usuario, empresa, CNPJ, email, telefone, celular, endereco, num, bairro, cidade, estado, usuario, senha, data_cadastro, data_ultimo_login, ativado) VALUES
(7, 'ADM', '1', 'GDesing e Programação', '00.000.000/0000-00', 'gretelferraz@gmail.com', '99999-9999', '99999-9999', 'Tr. minha rua', '72', 'Jd. São João', 'são Paulo', 'São Paulo', 'gretelferraz', 'minhasenha', '2016-08-25 02:16:15', '2016-10-26 15:56:15', 1),
(63, 'Comum', '1', 'empresa', '22.773.394/0001-20', 'gretelferraz@hotmail.com', '0000000000', '000000000', 'tr. minha rua', '72', 'Jardim São João (Zon', 'são paulo', 'são paulo', 'gretel', 'minha senha', '2016-09-14 23:37:35', '2016-09-17 17:25:28', 1);
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Seria isso Carlos Coelho?
Muito obrigada!
Existem duas formas, a primeira você já encontrou e deve tratar a diferença na programação. A segunda é usar join para cada tipo de entrada:
FROM produtos INNER JOIN entrada ON (entrada.produto = produtos.nome AND entrada.tipo = 'entrada') INNER JOIN entrada AS saida ON (saida.produto = produtos.nome AND saida.tipo = 'saida') GROUP BY produto.nomeVocê pode fazer tantos JOINs achar necessário. Também poderia fazer por subquery, mas acho mais "legível" joins.
Outro detalhe importante, quando são utilizadas aggregate functions, todas as demais colunas devem estar no group by. Logo, você não pode utilizar o asterísco () e deve definir coluna a coluna no group by.*