Donnerak Postado Agosto 5, 2013 Denunciar Share Postado Agosto 5, 2013 (editado) Olá Preciso dar um LEFT JOIN em 3 tabelas: char.charid = picklog.char_id item_db.id = picklog.nameid Alguém poderia me dar uma ajuda, para identificar o que estou fazendo de errado, pois quando uso assim funciona: $strSQL = "SELECT `char`.name, picklog.id, picklog.time, picklog.char_id, picklog.type, picklog.nameid, picklog.amount, picklog.refine, picklog.card0, picklog.card1, picklog.card2, picklog.card3, picklog.map FROM picklog LEFT JOIN `char` ON(picklog.char_id = `char`.char_id) WHERE type='T' AND `char`.account_id = $accountID order by picklog.id limit 15"; $rs = mysql_query($strSQL); while($row = mysql_fetch_array($rs)) { } Já deste modo não lista nada. $strSQL = "SELECT `item_db`.id, `item_db`.name_japanese, `char`.name, picklog.id, picklog.time, picklog.char_id, picklog.type, picklog.nameid, picklog.amount, picklog.refine, picklog.card0, picklog.card1, picklog.card2, picklog.card3, picklog.map FROM picklog LEFT JOIN `char` ON(picklog.char_id = `char`.char_id) LEFT JOIN `item_db` ON(picklog.nameid = `item_db`.id) WHERE type='T' AND `char`.account_id = $accountID order by picklog.id limit 15"; $rs = mysql_query($strSQL); while($row = mysql_fetch_array($rs)) { } Editado Agosto 5, 2013 por Donnerak Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Markus Magnus Postado Agosto 5, 2013 Denunciar Share Postado Agosto 5, 2013 A forma como você está fazendo esta consulta está correto, desde que a variável $acountID ainda esteja preenchida com valores corretos. Quer dizer que no seu banco de dados não existe nenhum registro que case com todas as cláusulas. Você pode tentar escrever a consulta para verificar a variável, mas acho que o problema é mesmo que não existem registros para esta consulta. Você pode ter certeza utilizando esta consulta. SELECT `item_db`.id, `item_db`.name_japanese, picklog.id, picklog.time, picklog.char_id, picklog.type, picklog.nameid, picklog.amount, picklog.refine, picklog.card0, picklog.card1, picklog.card2, picklog.card3, picklog.map FROM picklog LEFT JOIN `item_db` ON (picklog.nameid = `item_db`.id) WHERE type='T' AND char_id = $accountID order by picklog.id LIMIT 15 Se não voltar resultados quer dizer que não tem nenhum registro em item_db que faça referencia a picklog quando o id é igual ao da variável $acountID. Espero ter ajudado. Abraços Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Donnerak Postado Agosto 5, 2013 Autor Denunciar Share Postado Agosto 5, 2013 (editado) Ah entendi... Aquele AND que usei limita somente ao resultado que existir nas 3 tabelas. Ele não exibe nada porque realmente o item_db não tem nada de ligação com a variável $accountID e sim com o picklog.nameid testarei outro modo ao meio dia... Muito obrigado pela ajuda. Editado Agosto 5, 2013 por Donnerak Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Markus Magnus Postado Agosto 5, 2013 Denunciar Share Postado Agosto 5, 2013 Se quiser ajuda é só dar uma explicada em como está organizado o banco e o que você quer e é nois.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Donnerak Postado Agosto 5, 2013 Autor Denunciar Share Postado Agosto 5, 2013 (editado) Resolvido... Obrigado Markus. Editado Agosto 13, 2013 por Donnerak Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Markus Magnus Postado Agosto 5, 2013 Denunciar Share Postado Agosto 5, 2013 Acho que captei a ideia. Quer dizer que você tem entidades que estão na tabela char. Essas entidades trocam coisas entre si e essas trocas ficam registradas na tabela picklog. Por fim as informações dos itens estão cadastradas em item_db. Por tanto uma entidade pode fazer várias trocas, logo tem vários registros na tabela picklog para cada char E cada registro em picklog mostra valores de troca de um item em item_db, logo cada item_db tem, também, vários registros em picklog. Partindo desses princípios você quer selecionar todas as trocas efetuadas pelo char logado e por fim (essa parte eu to na dúvida) mostrar um valor final? ou mostrar cada alteração no saldo? como se fosse o livro caixa de uma empresa? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Donnerak Postado Agosto 6, 2013 Autor Denunciar Share Postado Agosto 6, 2013 é isso mesmo que você citou... pegasse a ideia direitinho... o item_db são as tabelas dos itens que eu uso somente para pegar o nome do item. Tipo na picklog.nameid aparece "501" quando eu pegar no item_db este ID (501) ele vai saber que deve escrever o nome "Maça". Mostrar um valor final tipo o exemplo que usei: Resultado da troca = Donnerak enviou 10 laranjas para Markus Magnus Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Markus Magnus Postado Agosto 6, 2013 Denunciar Share Postado Agosto 6, 2013 Consegui chegar até aqui. <table> <tr> <td> ID </td> <td> Hora </td> <td> Resultado da troca </td> </tr> <?php $strSQL = "SELECT `item_db`.id, `item_db`.name_japanese, `char`.name, picklog.id, picklog.time, picklog.char_id, picklog.type, picklog.nameid, picklog.amount, picklog.refine, picklog.card0, picklog.card1, picklog.card2, picklog.card3, picklog.map FROM picklog LEFT JOIN `char` ON(picklog.char_id = `char`.char_id) LEFT JOIN `item_db` ON(picklog.nameid = `item_db`.id) WHERE type='T' AND `char`.account_id = $accountID order by picklog.id limit 15"; $rs = mysql_query($strSQL); while($row = mysql_fetch_array($rs)) { ?> <tr> <td> <?php echo $row['id'];?> </td> <td> <?php echo $row['time'];?> </td> <td> <?php echo $row['name']; if ($row['amount'] > 0) { echo " recebeu "; } else { echo " enviou "; $row['amount'] = $row['amount']*-1; } echo "{$row['amount']} {$row['name_japanese']}(s)"; ?> </td> </tr> <?php } ?> </table> Dessa forma ele escreveria por exemplo: Donnerak enviou 10 laranjas Tem como você dar um exportar nessa tabela, por que eu não entendi a onde fica salvo o id do segundo char da transação. Pelo que eu entendi, para cada transação é criado dois registros na tabela picklog um com a entrada de itens para um char e outro para a saída dos mesmos itens para outro char, só que não vi nada que pudesse ser usado para relacionar esses dois registros, assim eu só tenho um lado da transação. Caso seja isso mesmo podemos selecionar apenas os registros nos quais o amount for negativo, logo temos os ids dos chars que enviaram depois fazemos um loop acessando cada registro e dentro do loop uma outra consulta que buscará outro picklog com mesmo amount só que positivo, mesmo item_db e mesma hora. Que daria em algo parecido com isso. <table> <tr> <td> ID </td> <td> Hora </td> <td> Resultado da troca </td> </tr> <?php $strSQL = "SELECT `item_db`.id, `item_db`.name_japanese, `char`.name, picklog.id, picklog.time, picklog.char_id, picklog.type, picklog.nameid, picklog.amount, picklog.refine, picklog.card0, picklog.card1, picklog.card2, picklog.card3, picklog.map FROM picklog LEFT JOIN `char` ON(picklog.char_id = `char`.char_id) LEFT JOIN `item_db` ON(picklog.nameid = `item_db`.id) WHERE type='T' AND `char`.account_id = $accountID and picklog.amount < 0 order by picklog.id limit 15"; $rs = mysql_query($strSQL); while($row = mysql_fetch_array($rs)) { ?> <tr> <td> <?php echo $row['id'];?> </td> <td> <?php echo $row['time'];?> </td> <td> <?php echo "{$row['name']} enviou {$row['amount']} {$row['name_japanese']}(s) para "; $row['amount'] = $row['amount']*-1; $strSQL = "SELECT `char`.name FROM picklog LEFT JOIN `char` ON(picklog.char_id = `char`.char_id) WHERE type='T' AND `char`.account_id = $accountID and picklog.amount = {$row['amount']} and picklog.nameid = {$row['nameid']} and picklog.time = {$row['time']}"; $rs2 = mysql_query($strSQL); while($row2 = mysql_fetch_array($rs2)) { echo $row2['name']; } ?> </td> </tr> <?php } ?> Não sei como você está fazendo a geração dos registros na tabela picklog porque se houver possibilidade de duas transações serem feitas ao mesmo tempo, quer dizer que João pode enviar para Maria 10 maças ao mesmo tempo que Pedro envia 10 maças para Paulo. Logo, na hora de fazer a segunda consulta retornara o nome de Maria e Paulo pois os dois receberam a mesma quantidade de maças na mesma hora o que ia escrever assim: João enviou 10 maçã(s) para MariaPaulo Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Donnerak Postado Agosto 8, 2013 Autor Denunciar Share Postado Agosto 8, 2013 Sim ocorrem centenas de transações ao mesmo tempo, porém cara usuário só pode enviar ou só pode receber de um outro usuário... nunca 2 transações tipo paulo e joao enviaram para pedro junto.... seria primeiro o paulo envia e depois o joão. Vou testar e posto o resultado. Muito obrigado pela atenção Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Donnerak Postado Agosto 13, 2013 Autor Denunciar Share Postado Agosto 13, 2013 Resolvido... Obrigado Markus. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Donnerak
Olá
Preciso dar um LEFT JOIN em 3 tabelas:
char.charid = picklog.char_id
item_db.id = picklog.nameid
Alguém poderia me dar uma ajuda, para identificar o que estou fazendo de errado, pois quando uso assim funciona:
Já deste modo não lista nada.
Editado por DonnerakLink para o comentário
Compartilhar em outros sites
9 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.