Ir para conteúdo

POWERED BY:

Arquivado

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

crazy4combat

[Resolvido] O PHP não retorna valor de duas tabelas (INNER JOIN)

Recommended Posts

Tenho as seguintes tabelas:

escola

Imagem Postada

 

alunos

Imagem Postada

 

 

o código é

 

<?
$bd_host="localhost";
$bd_nome="testes";
$bd_usuario="root";
$bd_senha="root";
$bd_conexao=mysql_pconnect($bd_host, $bd_usuario, $bd_senha);
mysql_select_db($bd_nome, $bd_conexao);
$bd_sql="SELECT alunos.* FROM alunos
LEFT JOIN escola ON alunos.id_escola = escola.id_escola";
$bd_query=mysql_query($bd_sql, $bd_conexao);
while($bd_linha=mysql_fetch_array($bd_query))
{
echo ($bd_linha[alunos.nome]."<br />");
echo ($bd_linha[escola.nome]."<br />");
}
?>

Porque não há retorno?

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenta assim:

 

SELECT a.* FROM alunos a LEFT JOIN escolas e ON ( a.id_escola = e.id_escola )

Se der erro de ambiguidade, terá de trocar o nome de umas das colunas do ID.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se não funcionar, tenta assim também:

 

SELECT a.*, e.`nome` AS escola FROM `alunos` AS a LEFT JOIN `escolas` AS e ON (a.`id_escola` = e.`id_escola`) ORDER BY a.`id_alunos` ASC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma opção..

SELECT a.* FROM alunos a
JOIN escola USING (id_escola)

http://dev.mysql.com/doc/refman/4.1/pt/join.html

 

Carlos Eduardo

 

EDIT: Relendo seu post, percebi outras coisas erradas.

 

SELECT a.* FROM alunos a

Você está selecionando todos os campos da tabela ALUNOS. O ESCOLA.NOME está na tabela ESCOLA. Use a dica do Tiu-Talk que vai funcionar...

Outra coisa...

 

echo ($bd_linha[alunos.nome]."<br />");
echo ($bd_linha[escola.nome]."<br />");
Falta aspas no índice. Assim...

 

echo ($bd_linha['alunos.nome']."<br />");
echo ($bd_linha['escola.nome']."<br />");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mais uma opção..

SELECT a.* FROM alunos a
JOIN escola USING (id_escola)

http://dev.mysql.com/doc/refman/4.1/pt/join.html

 

Carlos Eduardo

 

EDIT: Relendo seu post, percebi outras coisas erradas.

 

SELECT a.* FROM alunos a

Você está selecionando todos os campos da tabela ALUNOS. O ESCOLA.NOME está na tabela ESCOLA. Use a dica do Tiu-Talk que vai funcionar...

Outra coisa...

 

echo ($bd_linha[alunos.nome]."<br />");
echo ($bd_linha[escola.nome]."<br />");
Falta aspas no índice. Assim...

 

echo ($bd_linha['alunos.nome']."<br />");
echo ($bd_linha['escola.nome']."<br />");

Obrigados a todos, mas aínda não há retorno!

 

matias_rezende eu coloquei as aspas, mas não obtive sucesso e pelo que eu saiba as aspas é opcional.

 

gRATO

Compartilhar este post


Link para o post
Compartilhar em outros sites

aparentemente está normal sua query SQL, utilize um print_r na bd_linha para exibir todos resultados, talvez o problema seja no echo.

 

print_r($bd_linha);

 

alguém me fala o bbcode do php? não achei até agora o botãozinho :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho... tente o seguinte e veja se mostra algum erro:

Troque a linha:

$bd_query=mysql_query($bd_sql, $bd_conexao);
por

$bd_query=mysql_query($bd_sql, $bd_conexao) or exit(mysql_error());
Se mostrar algo de novo poste o que deu....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu recriei as tabelas localmente aqui, inseri uns registros como na sua foto, testei a query que te passei e ainda incrementei com uma cláusula WHERE e apareceu direitinho.

 

O erro está no seu laço.

 

Troca ele porisso:

 

$registros = array();
while($bd_linha=mysql_fetch_array($bd_query))
{
$registros[] = $bd_linha;
}

Dá um print_r() (entre tags <pre></pre>) e veja se aparece agora.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu recriei as tabelas localmente aqui, inseri uns registros como na sua foto, testei a query que te passei e ainda incrementei com uma cláusula WHERE e apareceu direitinho.

 

O erro está no seu laço.

 

Troca ele porisso:

 

$registros = array();
while($bd_linha=mysql_fetch_array($bd_query))
{
$registros[] = $bd_linha;
}

Dá um print_r() (entre tags <pre></pre>) e veja se aparece agora.

 

Cara obrigadão por me ajudar, mas não entendi a função da tag <prev> então literalmente coloquei o código

<?
$bd_host="localhost";
$bd_nome="testes";
$bd_usuario="root";
$bd_senha="root";
$bd_conexao=mysql_pconnect($bd_host, $bd_usuario, $bd_senha);
mysql_select_db($bd_nome, $bd_conexao);
$bd_sql="SELECT * 
FROM alunos
LEFT JOIN escola 
ON alunos.id_escola=escola.id_escola";
$bd_query=mysql_query($bd_sql, $bd_conexao) or exit(mysql_error());
$registros = array();
while($bd_linha=mysql_fetch_array($bd_query))
{
$registros[] = $bd_linha;
print_r("<pre></pre>");
}
?>

Nada de resultados e também uso apache e MySQL localmente lo Ubuntu. As vezes é melhor a msg de erro do que nada.

Só um detalhe no MySQL preciso marcar que é uma chave estrangeira? Como? Não achei a opção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim...

 

echo '<pre>';
while($bd_linha=mysql_fetch_array($bd_query))
{
$registros[] = $bd_linha;
}
print_r($registros);
echo '</pre>';

Veja o que aparece.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim...

 

echo '<pre>';
while($bd_linha=mysql_fetch_array($bd_query))
{
$registros[] = $bd_linha;
}
print_r($registros);
echo '</pre>';

Veja o que aparece.

 

Carlos Eduardo

 

Funcionou aparece

Array

(

[0] => Array

(

[0] => 1

[id_alunos] => 1

[1] => Luciano

[nome] => Consolata

[2] => 1

[id_escola] => 1

[3] => 1

[4] => Consolata

)

 

[1] => Array

(

[0] => 2

[id_alunos] => 2

[1] => Guilherme

[nome] => Objetivo

[2] => 2

[id_escola] => 2

[3] => 2

[4] => Objetivo

)

 

[2] => Array

(

[0] => 3

[id_alunos] => 3

[1] => João

[nome] => Consolata

[2] => 1

[id_escola] => 1

[3] => 1

[4] => Consolata

)

 

[3] => Array

(

[0] => 4

[id_alunos] => 4

[1] => Leonardo

[nome] => Consolata

[2] => 1

[id_escola] => 1

[3] => 1

[4] => Consolata

)

 

[4] => Array

(

[0] => 5

[id_alunos] => 5

[1] => Maíra

[nome] => Consolata

[2] => 1

[id_escola] => 1

[3] => 1

[4] => Consolata

)

 

[5] => Array

(

[0] => 6

[id_alunos] => 6

[1] => Sílvia

[nome] => Objetivo

[2] => 2

[id_escola] => 2

[3] => 2

[4] => Objetivo

)

 

[6] => Array

(

[0] => 7

[id_alunos] => 7

[1] => Thaís

[nome] => Objetivo

[2] => 2

[id_escola] => 2

[3] => 2

[4] => Objetivo

)

)

 

Obrigado! Mas, ainda não entendi a tag <prev> só sei que não usando não funciona. No Google aparece como tag de WML.

Outra coisa convenhamos que não é boa solução de apresentar ao usuário queria algo mais legível como:

 

Luciano estuda no Consolata

Guilherme estuda no Consolata

João estuda no Consolata

Maíra estuda no Consolata

Sívia estuda no Objetivo

Taís estuda no Objetivo

na minha lógica seria

while($bd_linha=mysql_fetch_array($bd_query))
{
echo ($linha[alunos.nome]." estuda no ".$linha[escola.nome]."<br />");
}

Mas como visto não funciona, alguém pode me explicar o <prev>? Como posso deixar o resultado mais limpo como sitado acima?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz assim...

 

$bd_sql="SELECT a.nome as nome_aluno, e.nome as nome_escola 
FROM alunos a
LEFT JOIN escola a
ON a.id_escola = e.id_escola";

$bd_query=mysql_query($bd_sql, $bd_conexao) or exit(mysql_error());
$registros = array();
while($bd_linha=mysql_fetch_array($bd_query))
{
echo $linha['nome_aluno'].' estuda no '.$linha['nome_escola'].'<br />';
}

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bobeira minha... Coloquei o apelido das duas tabelas como a. Agora o escola já está como e.

 

$bd_sql="SELECT a.nome as nome_aluno, e.nome as nome_escola 
FROM alunos a
LEFT JOIN escola e
ON a.id_escola = e.id_escola";

$bd_query=mysql_query($bd_sql, $bd_conexao) or exit(mysql_error());
$registros = array();
while($bd_linha=mysql_fetch_array($bd_query))
{
echo $linha['nome_aluno'].' estuda no '.$linha['nome_escola'].'<br />';
}

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bobeira minha... Coloquei o apelido das duas tabelas como a. Agora o escola já está como e.

 

$bd_sql="SELECT a.nome as nome_aluno, e.nome as nome_escola 
FROM alunos a
LEFT JOIN escola e
ON a.id_escola = e.id_escola";

$bd_query=mysql_query($bd_sql, $bd_conexao) or exit(mysql_error());
$registros = array();
while($bd_linha=mysql_fetch_array($bd_query))
{
echo $linha['nome_aluno'].' estuda no '.$linha['nome_escola'].'<br />';
}

Carlos Eduardo

 

Só aparece

estuda no

estuda no

estuda no

estuda no

estuda no

estuda no

estuda no

Mesmo substituindo pelas tabelas certas

 

$bd_query=mysql_query($bd_sql, $bd_conexao) or exit(mysql_error());
$registros = array();
while($bd_linha=mysql_fetch_array($bd_query))
{
echo $bd_linha['a.nome'].' estuda no '.$bd_linha['e.nome'].'<br />';
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho... muito estranho... Veja o que aparece.

 

$bd_query=mysql_query($bd_sql, $bd_conexao) or exit(mysql_error());
$registros = array();
while($bd_linha=mysql_fetch_array($bd_query))
{
print_r($bd_linha);
echo $bd_linha['a.nome'].' estuda no '.$bd_linha['e.nome'].'<br />';
}

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho... muito estranho...

 

Não é não, heheh. Existe um erro pequenininho que está passando despercebido.

 

Acho que o código abaixo resolve o problema:

 

if ( ( $conn = mysql_pconnect( $bd_host , $bd_usuario, $bd_senha ) ) ){
    if ( mysql_select_db( $bd_nome , $conn ) ){
        $sql = "select e.nome 'escola', a.nome 'aluno' from `escola` e join `alunos` a on a.id_escola = e.id_escola order by escola;";

        if ( ( $res = mysql_query( $sql , $conn ) ) ){
            $table = "<table><thead><tr><th>Escola</th><th>Aluno</th></tr></thead><tbody><tr>%s</tr></tbody></table>";
            $dados = array();

            while ( ( $row = mysql_fetch_array( $res , MYSQL_ASSOC ) ) ){
                $dados[] = sprintf( "<td>%s</td>" , implode( "</td><td>" , $row ) );
            }

            mysql_free_result( $res );

            printf( $table , implode( "</tr><tr>" , $dados ) );
        }
    }
    
    //Descomente a linha abaixo se você não for mais usar a conexão
    //mysql_close( $conn );
}

A saída será:

 

<table>
    <thead>
        <tr><th>Escola</th><th>Aluno</th></tr>
    </thead>
    <tbody>
        <tr><td>Consolata</td><td>João</td></tr>
        <tr><td>Consolata</td><td>Leonardo</td></tr>
        <tr><td>Consolata</td><td>Maíra</td></tr>
        <tr><td>Consolata</td><td>Luciano</td></tr>
        <tr><td>Objetivo</td><td>Silvia</td></tr>
        <tr><td>Objetivo</td><td>Guilherme</td></tr>
        <tr><td>Objetivo</td><td>Thaís</td></tr>
    </tbody>
</table>

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.