Jump to content


Photo

Erro Trabalhando Com 4 Tabelas Mysql


  • Faça o login para participar
14 replies to this topic

#1 Carol Designer

Carol Designer

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Feminino
  • Localidade:São Paulo

Posted 08/09/2010, 09:38

Pessoal to com problema para trabalhar com 4 tabelas.
Tenho 2 tabelas uma de produto outra de pedido ai somar todos os pedidos fiz o código abaixo que funciona perfeitamente.
<?
include "dbconfig.php"; 
$sql2 =" SELECT SUM(pedidos_private3.QUANTIDADE) AS QUANTIDADE_P,  pedidos_private3.ID_PRODUTO as ID_P, prod_vic_private.codigo as codigo_P
FROM pedidos_private3  
JOIN prod_vic_private ON pedidos_private3.ID_PRODUTO = prod_vic_private.refTran 
GROUP BY prod_vic_private.codigo" ;
$query2 = mysql_query($sql2)  or die (mysql_error());
while ($coluna2 = mysql_fetch_array($query2)){ 
?>

Porem tenho dois tipo de clientes então se tornam 4 tabelas 2 de produtos e 2 pedidos preciso somar quantos produtos tenho no total mas não esta dando certo, quando insiro o código abaixo a primeira coluna o COD. Produto sempre se repete e os valores completamente diferentes.
O correto seria
ProdutoP
produto Quantidade
0.6221.L22 = 5
0.6221.L24 = 6

Produtof
produto Quantidade
0.6221.L22 = 16
0.6221.L24 = 8

SOMA
0.6221.L22 = 21
0.6221.L24 = 14

Com o código abaixo ele fica assim

ProdutoP
produto Quantidade
0.6221.L22 = 80
0.6221.L22 = 40

Produtof
produto Quantidade
0.6221.L22 = 64
0.6221.L24 = 32

SOMA
0.6221.L22 = 144
0.6221.L24 = 72


Pelo que eu estou entendendo ele esta pegando a quantidade e multiplicando por 4 no Produtof e 16 no produtoP

<?
include "dbconfig.php"; 
$sql2 =" SELECT 
SUM(pp.QUANTIDADE) AS QUANTIDADE_P, 
SUM(pf.QUANTIDADE) AS QUANTIDADE_f, 
SUM(pf.QUANTIDADE+pp.QUANTIDADE) AS QUANTIDADE_T,
pvp.codigo as codigo_P, 
pvf.codigo as codigo_f 
FROM pedidos_private3 pp
INNER JOIN  pedidos_fisica3 pf  
INNER JOIN prod_vic_private pvp ON  (pvp.refTran = pp.ID_PRODUTO)
INNER JOIN prod_vic_fisica pvf ON (pvf.refTran = pf.ID_PRODUTO)
GROUP BY pvp.refTran, pvf.refTran, pp.ID_PRODUTO,  pf.ID_PRODUTO, pvp.codigo,  pvp.codigo 
order by pvp.codigo,  pvf.codigo 
" ; 
$query2 = mysql_query($sql2)  or die (mysql_error());
while ($coluna2 = mysql_fetch_array($query2)){ 
?>


#2 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 08/09/2010, 10:52

Faltou a condição do JOIN do pedidos_fisica3. Se os produtos forem os mesmos, faça:

INNER JOIN pedidos_fisica3 pf ON pf.ID_PRODUTO=pp.ID_PRODUTO

E no GROUP BY, só é necessário agrupar pelos campos que aparecem no SELECT. No caso, pvp.codigo e pvf.codigo.

#3 Carol Designer

Carol Designer

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Feminino
  • Localidade:São Paulo

Posted 08/09/2010, 14:04

Faltou a condição do JOIN do pedidos_fisica3. Se os produtos forem os mesmos, faça:

INNER JOIN pedidos_fisica3 pf ON pf.ID_PRODUTO=pp.ID_PRODUTO

E no GROUP BY, só é necessário agrupar pelos campos que aparecem no SELECT. No caso, pvp.codigo e pvf.codigo.




LeoB Ícone
Os ID_PRODUTO é diferente porque em uma categoria tem produtos que na outra não tem, a outra forma?

#4 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 08/09/2010, 19:56

Mostra aí a estrutura das tabelas pra gente entender seu banco melhor.

#5 Carol Designer

Carol Designer

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Feminino
  • Localidade:São Paulo

Posted 08/09/2010, 20:39

Mostra aí a estrutura das tabelas pra gente entender seu banco melhor.


-- Estrutura da tabela `prod_vic_fisica`
--

CREATE TABLE `prod_vic_fisica` (
`refTran` bigint(200) NOT NULL auto_increment,
`produto` longtext collate latin1_general_ci NOT NULL,
`descricao` longtext collate latin1_general_ci NOT NULL,
`qtdPontos` varchar(200) collate latin1_general_ci NOT NULL,
`codigo` varchar(200) collate latin1_general_ci NOT NULL,
`foto` varchar(200) collate latin1_general_ci NOT NULL,
`fotog` varchar(200) collate latin1_general_ci NOT NULL,
`valor` varchar(200) collate latin1_general_ci NOT NULL,
`data` varchar(200) collate latin1_general_ci NOT NULL,
`ar` varchar(200) collate latin1_general_ci NOT NULL,
`kit` varchar(200) collate latin1_general_ci NOT NULL,
`kits` varchar(200) collate latin1_general_ci NOT NULL,
`posicao` varchar(200) collate latin1_general_ci NOT NULL,

-- Estrutura da tabela `prod_vic_private`
--

CREATE TABLE `prod_vic_private` (
`refTran` bigint(200) NOT NULL auto_increment,
`produto` longtext collate latin1_general_ci NOT NULL,
`descricao` longtext collate latin1_general_ci NOT NULL,
`qtdPontos` varchar(200) collate latin1_general_ci NOT NULL,
`codigo` varchar(200) collate latin1_general_ci NOT NULL,
`foto` varchar(200) collate latin1_general_ci NOT NULL,
`fotog` varchar(200) collate latin1_general_ci NOT NULL,
`valor` varchar(200) collate latin1_general_ci NOT NULL,
`data` varchar(200) collate latin1_general_ci NOT NULL,
`ar` varchar(200) collate latin1_general_ci NOT NULL,
`kit` varchar(200) collate latin1_general_ci NOT NULL,
`kits` varchar(200) collate latin1_general_ci NOT NULL,
`posicao` varchar(200) collate latin1_general_ci NOT NULL,
`QT` varchar(200) collate latin1_general_ci NOT NULL,


-- Estrutura da tabela `pedidos_private3`
--

CREATE TABLE `pedidos_private3` (
`ID_PEDIDO` bigint(200) unsigned NOT NULL default '0',
`ID_PRODUTO` tinyint(3) unsigned default NULL,
`QUANTIDADE` tinyint(3) unsigned default NULL,
`ID_CLIENTE` varchar(200) collate latin1_general_ci NOT NULL,
`DATA` varchar(200) collate latin1_general_ci NOT NULL



-- Estrutura da tabela `pedidos_fisica3`
--

CREATE TABLE `pedidos_fisica3` (
`ID_PEDIDO` bigint(200) unsigned NOT NULL default '0',
`ID_PRODUTO` tinyint(3) unsigned default NULL,
`QUANTIDADE` tinyint(3) unsigned default NULL,
`ID_CLIENTE` varchar(200) collate latin1_general_ci NOT NULL,
`DATA` varchar(200) collate latin1_general_ci NOT NULL


eu so preciso que ele me liste todos os codigos com a quantidade de cada
ex>
codigo tal = 50

Edição feita por: Carol Designer, 08/09/2010, 20:42.


#6 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 08/09/2010, 21:14

refTran se relaciona com ID_PRODUTO. E você quer somar as quantidades dos produtos agrupando pelo código em prod_vic. Sendo que os produtos em cada tabela não são necessariamente os mesmos, mas produtos iguais possuem códigos iguais. É isso mesmo?

#7 Carol Designer

Carol Designer

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Feminino
  • Localidade:São Paulo

Posted 08/09/2010, 21:21

refTran se relaciona com ID_PRODUTO. E você quer somar as quantidades dos produtos agrupando pelo código em prod_vic. Sendo que os produtos em cada tabela não são necessariamente os mesmos, mas produtos iguais possuem códigos iguais. É isso mesmo?


Isso mesmo perfeito ja postei em varios forums = (

#8 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 08/09/2010, 21:31

Com uma query só não dá. Você precisa criar uma view com o seguinte SQL:

SELECT pvf.codigo, SUM(pf.QUANTIDADE) qtd FROM prod_vic_fisica3 pvf INNER JOIN pedidos_fisica3 pf ON pvf.refTran=pf.ID_PRODUTO GROUP BY pvf.codigo UNION SELECT pvp.codigo, SUM(pp.QUANTIDADE) FROM prod_vic_private3 pvp INNER JOIN pedidos_private3 pf ON pvp.refTran=pp.ID_PRODUTO GROUP BY pvp.codigo

Você seleciona os dados de um cliente, junta com o do outro e aí agora faz um total mesmo. Vamos supor que tenha chamado a view de produto_qtd. Na sua aplicação você faz:

SELECT codigo, SUM(qtd) FROM produto_qtd GROUP BY codigo


#9 Carol Designer

Carol Designer

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Feminino
  • Localidade:São Paulo

Posted 09/09/2010, 00:02

Com uma query só não dá. Você precisa criar uma view com o seguinte SQL:

SELECT pvf.codigo, SUM(pf.QUANTIDADE) qtd FROM prod_vic_fisica3 pvf INNER JOIN pedidos_fisica3 pf ON pvf.refTran=pf.ID_PRODUTO GROUP BY pvf.codigo UNION SELECT pvp.codigo, SUM(pp.QUANTIDADE) FROM prod_vic_private3 pvp INNER JOIN pedidos_private3 pf ON pvp.refTran=pp.ID_PRODUTO GROUP BY pvp.codigo

Você seleciona os dados de um cliente, junta com o do outro e aí agora faz um total mesmo. Vamos supor que tenha chamado a view de produto_qtd. Na sua aplicação você faz:

SELECT codigo, SUM(qtd) FROM produto_qtd GROUP BY codigo



Leo eu sou loira =( hauhau e não entendi... tentei de varias formas aqui o que vc falou mas todas estao dando erro.
tentei criar um novo select. e so saiu caca to pirando ja faz duas semanas que estou parada ai = (

#10 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 09/09/2010, 08:20

Você não deve ter entendido a parte da view. O problema é que no MySQL subquery é um tanto limitado. Veja a idéia do que eu quero dizer:

Primeiro você faz a contagem de um cliente, como um total parcial:

SELECT pvf.codigo,
       SUM(pf.quantidade) qtd
FROM   prod_vic_fisica3 pvf
       INNER JOIN pedidos_fisica3 pf
         ON pvf.reftran = pf.id_produto
GROUP  BY pvf.codigo
Depois, usando UNION, você acrescenta a contagem do outro cliente:

SELECT pvp.codigo,
       SUM(pp.quantidade)
FROM   prod_vic_private3 pvp
       INNER JOIN pedidos_private3 pf
         ON pvp.reftran = pp.id_produto
GROUP  BY pvp.codigo
Ou seja:

SELECT pvf.codigo,
       SUM(pf.quantidade) qtd
FROM   prod_vic_fisica3 pvf
       INNER JOIN pedidos_fisica3 pf
         ON pvf.reftran = pf.id_produto
GROUP  BY pvf.codigo
UNION
SELECT pvp.codigo,
       SUM(pp.quantidade)
FROM   prod_vic_private3 pvp
       INNER JOIN pedidos_private3 pf
         ON pvp.reftran = pp.id_produto
GROUP  BY pvp.codigo
Se você rodar esse SQL direto no seu banco, você vai ver que é só como se ele tivesse colado o resultado dos dois selects. Você vai ter os registros referentes ao primeiro cliente nos primeiros registros e depois começam os registros do segundo cliente. Aí agora você precisa fazer o total dos dois.

SELECT codigo,
       SUM(qtd)
FROM   (SELECT pvf.codigo,
               SUM(pf.quantidade) qtd
        FROM   prod_vic_fisica3 pvf
               INNER JOIN pedidos_fisica3 pf
                 ON pvf.reftran = pf.id_produto
        GROUP  BY pvf.codigo
        UNION
        SELECT pvp.codigo,
               SUM(pp.quantidade)
        FROM   prod_vic_private3 pvp
               INNER JOIN pedidos_private3 pf
                 ON pvp.reftran = pp.id_produto
        GROUP  BY pvp.codigo)
GROUP  BY codigo
Só que esse tipo de consulta não é permitida no MySQL. Pelo menos não até a última vez que precisei usar. A solução então é criar uma view contento esse SQL do UNION e depois fazer o SELECT nela, como eu sugeri no post anterior.

Qual programa você usa pra gerenciar seu banco de dados? Pode ser que ele não tenha suporte a views. Qualquer coisa dê uma procurada no google sobre o assunto. Não é difícil de entender.

#11 Carol Designer

Carol Designer

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Feminino
  • Localidade:São Paulo

Posted 09/09/2010, 10:42

Estou usando o phpMyAdmin 2.11.9.2 da locaweb

Eu fiz o primeiro passo que é deu certinho ele lista todos os produtos e quantidades = ) mas o segundo ainda não consigo = (




<?
include "dbconfig.php"; 
$sql2 =" 
SELECT pvf.codigo,
       SUM(pf.quantidade) qtd
FROM   prod_vic_fisica pvf
       INNER JOIN pedidos_fisica3 pf
         ON pvf.reftran = pf.id_produto
GROUP  BY pvf.codigo
UNION
SELECT pvp.codigo,
       SUM(pp.quantidade)
FROM   prod_vic_private pvp
       INNER JOIN pedidos_private3 pp
         ON pvp.reftran = pp.id_produto
GROUP  BY pvp.codigo
" ; 
$query2 = mysql_query($sql2)  or die (mysql_error());
while ($coluna2 = mysql_fetch_array($query2)){ 



?>

<style type="text/css">@import url("css/default.css");</style>


<table width="600" height="20" border="0" cellpadding="0" cellspacing="0"  >
  <tr>
<td align="center" valign="middle" ><table width="400"  cellpadding='0' cellspacing='0' class="rodape-planeta4">
  <tr>
    <td width="200" align='left' ><?php echo $coluna2['codigo']  ?></td>
    <td width="100" align='left' > = <?php echo $coluna2['qtd']  ?></td>
  </tr>
</table>
<? } ?>


#12 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 09/09/2010, 22:01

Você ainda não pegou a parte da view.

View é uma coisa pra ser criada no banco. É um recurso, como tabelas, triggers, stored procedure etc.

Peguei alguns links pra você dar uma lida:

  • http://wiki.locaweb.com.br/pt-br/Criar_View_Mysql
  • http://imasters.uol.com.br/artigo/8765/mysql/trabalhando_com_views_no_mysql/
  • http://infoblogs.com.br/view.action?contentId=191843&Criar-Visao-Mysql-Codigo-explicado.html
Não sei como é o suporte do phpmyadmin pra isso, mas parece que vem melhorando nas últimas versões. É fácil também criar direto por SQL. Nesses links mostra como. Depois que você entender esse recurso, volte aos meus posts anteriores. Acho que vão ficar mais claros.

Vamos com calma que vai dar certo. Só quero que você entenda de verdade a solução.

#13 Carol Designer

Carol Designer

    Novato no fórum

  • Usuários
  • 8 posts
  • Sexo:Feminino
  • Localidade:São Paulo

Posted 10/09/2010, 17:53

Leooo consegui = )))))
Com o código ele cria uma "tabela" la no meu banco com os dados ai dei um novo select e ficou perfeito = ) muito obrigada. = )
Só que agora estou com outro problema = ( testei em 3 navegadores que eu tenho no pc no Google Chrome ele funcionou perfeitamente. no mozzila ele só captura alguns resultados e no IE ele captura menos ainda não entendo porque ocorre isso.

<?
include "dbconfig.php"; 

$sql2 ="CREATE VIEW soma AS SELECT pvf.codigo,
       SUM(pf.quantidade) qtd
FROM   prod_vic_fisica pvf
       INNER JOIN pedidos_fisica3 pf
         ON pvf.reftran = pf.id_produto
GROUP  BY pvf.codigo
UNION
SELECT pvp.codigo,
       SUM(pp.quantidade)
FROM   prod_vic_private pvp
       INNER JOIN pedidos_private3 pp
       ON pvp.reftran = pp.id_produto
GROUP  BY pvp.codigo;" ;

$sql3= "SELECT codigo, SUM(qtd) as q FROM soma GROUP  BY codigo;";

$query3 = mysql_query($sql3)  or die (mysql_error());
while ($coluna2 = mysql_fetch_array($query3)){ 

?>

<style type="text/css">@import url("css/default.css");</style>


<table width="600" height="20" border="0" cellpadding="0" cellspacing="0"  >
  <tr>
<td align="center" valign="middle" ><table width="400"  cellpadding='0' cellspacing='0' class="rodape-planeta4">
  <tr>
    <td width="200" align='left' ><?php echo $coluna2['codigo']  ?></td>
    <td width="100" align='left' > = <?php echo $coluna2['q']  ?></td>
  </tr>
</table>
<? } ?>



#14 LeoB

LeoB

    Super Veterano

  • Usuários
  • 1876 posts
  • Sexo:Masculino
  • Interesses:Programação

Posted 10/09/2010, 18:40

Acho que esse seu while não está bem montado. Porque, veja só, pra cada registro encontrado ele vai imprimir o <style> e abrir uma tabela que não é fechada depois. No Mozzila ou no IE, vá em Exibir > Código-fonte e veja só como ele está sendo gerado. Talvez o problema não seja nem com o PHP. Talvez seja o HTML inconsistente que está sendo impresso. Dá uma olhada aí.

#15 André Manoel

André Manoel

    Doutor

  • Usuários
  • 996 posts
  • Sexo:Masculino
  • Localidade:Brasilia

Posted 13/09/2010, 10:50

Bem... pela minha experiência com o IE...

O problema está ocorrendo porque devem ter tags que foram criadas no HTML e não foram fechadas.
Quando uma tag não é fechada no IE sempre dá algum problema....

As vezes é isso mesmo.
Agora tem que ver como está sendo gerado esse HTML.
Não esquecer de abrir e sempre fechar a tag HTML.

(y)
Iniciando na Ajuda On line...

Posted Image Meu post lhe ajudou? Reputar/votar é uma das formas de agradecer.




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq