Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Problema com Query SQL


Donnerak

Pergunta

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 por Donnerak
Link para o comentário
Compartilhar em outros sites

9 respostass a esta questão

Posts Recomendados

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

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 por Donnerak
Link para o comentário
Compartilhar em outros sites

  • 0

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?

Link para o comentário
Compartilhar em outros sites

  • 0

é 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

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

  • 0

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

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...