Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal, estou fazendo um INNER JOIN entre duas tabelas do meu banco. Mas estou com dificuldade para mostrar o resultado organizado na tela, alguém poderia me ajudar?
As tabelas são de categoria e serviço (relacionado a categoria). Na tabela categoria tenho somente o id e o nome da categoria. Ja na tabela de serviço tenho várias informações, mas preciso trazer somente o código do serviço e o nome do serviço.
A query que montei foi esta:
SELECT t1.*, t2.* FROM produto_tipo AS t1 INNER JOIN categorias AS t2 ON t2.id = t1.categoria
Onde PRODUTO_TIPO é a tabela de serviços e CATEGORIAS é a tabela de categoria, e o CAMPO categoria é a Chave Estrangeira (Sim, esta estranho, mas nao fui eu quem montou este BD). Quando executo esta query no phpmyadmin ele retorna as informações que preciso, mas, sem organização. Ele retorna assim:
id cod categoria id nome_categoria
118 ho 4 4 Hospedagem
117 dev 3 3 Desenvolvimento
116 444 3 3 Desenvolvimento
119 ho2 4 4 Hospedagem
120 emmkt 5 5 Marketing
121 rs 5 5 Marketing
Bem, primeiro vou dizer como quero as informações na tela...
Categoria: Hospedagem (Que tem id=4)
código Serviço
ho Servidor
ho2 SMTP
Categoria: Desenvolvimento(Que tem id=3)
código Serviço
dev Servidor
444 SMTP
Categoria: Marketing (Que tem id=5)
código Serviço
emmkt E-mail Marketing
rs Rede social
Lembrando que as informações do campo SERVIÇO esta na tabela de serviços (PRODUTO_TIPO), com o campo chamado titulo.
No código PHP estou chamando essas informações assim:
<div class="row" align="center">
<div class="col-lg-6">
<h2>Categoria: <span style="color: #169F85;"><i><b>'. $row['nome_categoria'].'</b></i></span></h2>
</div>
<div class="col-lg-6 pull-right">
<h2>Ações:
<a href="categoria_form.php?n='.$row['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</h2>
</div>
</div>
<tr>
<td class="text-center"><strong>'.$row['cod'].'</strong></td>
<td class="text-center">'.$row['titulo'].'</td>
<td class="text-center"><font class="btn btn-xs btn-success">R$ '.Decimal($row['valorCusto']).'</font></td>
<td class="text-center"><font class="btn btn-xs btn-success">R$ '.Decimal($row['valorFinal']).'</font></td>
<td class="text-center">
<a href="produtotipo_form.php?n='.$row['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</td>
</tr>';
E deste jeito ele aparece assim na tela:
Categoria: Hospedagem
Categoria: Desenvolvimento
Categoria: Desenvolvimento
Categoria: Hospedagem
Categoria: Marketing
Categoria: Marketing
**código** **Serviço**
emmkt E-mail Marketing
rs Rede social
dev Servidor
444 SMTP
ho Servidor
ho2 SMTP
Não sei como resolver isso :/
Alguém poderia me ajudar?
Desde já, grato!Olá @AnthraxisBR, obrigado pela resposta!
Quando li seu código achei que funcionaria, mas não funcionou deste jeito. E você entendeu mesmo o que quero.
Fiz do jeito que você mencionou, e a unica mudança é que ele para de repetir a categoria.
Antes estava assim:
>
46 minutos atrás, Gabrielvt14 disse:
Categoria: Hospedagem
Categoria: Desenvolvimento
Categoria: Desenvolvimento
Categoria: Hospedagem
Categoria: Marketing
Categoria: Marketing
código Serviço
emmkt E-mail Marketing
rs Rede social
dev Servidor
444 SMTP
ho Servidor
ho2 SMTP
E do jeito que disse para fazer ficou assim:
Categoria: Hospedagem
Categoria: Desenvolvimento
Categoria: Marketing
código Serviço
emmkt E-mail Marketing
rs Rede social
dev Servidor
444 SMTP
ho Servidor
ho2 SMTP
<?php
$sql = "SELECT * FROM categorias";
$rs = $conecta->query($sql);
while($row = mysqli_fetch_array($rs)){
$categoria = $row['categoria'];
echo $categoria;
$sql_2 = "SELECT * FROM produto_tipo WHERE categoria = '$categoria'";
$rs_2 = $conecta->query($sql_2);
while($row_2 = mysqli_fetch_array($rs_2)){
echo $tipo_produto;
//Aqui dentro você só tem os tipos de cada categoria
}
}
Acho que você colocou tudo dentro do segundo loop é isso ?
Coloca a categoria antes do segundo loop, e dentro do loop só os tipos, ve os 'echos' que eu coloquei ali.É, eu fiz desta forma mesmo. Ficou assim:
sql2 = "SELECT * FROM categorias";
$query2 = mysql_query($sql2);
$conta2 = mysql_num_rows($query2);
$montatabela = '';
while($row2 = mysql_fetch_assoc($query2)){
$montatabela.='
<div class="row" align="center">
<div class="col-lg-6">
<h2>Categoria: <span style="color: #169F85;"><i><b>'. $row2['nome_categoria'].'</b></i></span></h2>
</div>
<div class="col-lg-6 pull-right">
<h2>Ações:
<a href="categoria_form.php?n='.$row2['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row2['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</h2>
</div>
</div>';
$categoria = $row2['id'];
$sql3 = "SELECT * FROM produto_tipo WHERE categoria = '$categoria'";
$query3 = mysql_query($sql3);
$conta3 = mysql_num_rows($query3);
while ($row3 = mysql_fetch_assoc($query3)) {
$montatabela.='
<tr>
<td class="text-center"><strong>'.$row3['cod'].'</strong></td>
<td class="text-center">'.$row3['titulo'].'</td>
<td class="text-center"><font class="btn btn-xs btn-success">R$ '.Decimal($row3['valorCusto']).'</font></td>
<td class="text-center"><font class="btn btn-xs btn-success">R$ '.Decimal($row3['valorFinal']).'</font></td>
<td class="text-center">
<a href="produtotipo_form.php?n='.$row3['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row3['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</td>
</tr>';
}
}
E depois estou chamando assim:
<div class="row">
<div class="col-lg-3">
<p class="text-muted font-13 m-b-30">
Confira a relação de todas as categorias disponíveis.
</p>
</div>
<div class="col-lg-7 pull-right">
<a type="button" class="btn btn-dark btn-sm" href="categoria_form.php"><i class="glyphicon glyphicon-plus"></i> Criar nova categoria</a>
</div>
<table id="datatable-responsive" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%">
<thead>
<?php echo $montatabelatitulo; ?>
</thead>
<tbody>
<?php echo $montatabela; ?>
</tbody>
</table>
</div>Por que você colocando dentro de <tr> sem inciar <table> ?
Pra mim exibiu assim aqui:
Categoria: ***'. $row2['nome_categoria'].'***
Ações:
**'.$row3['cod'].'** '.$row3['titulo'].' R$ '.Decimal($row3['valorCusto']).' R$ '.Decimal($row3['valorFinal']).' **'.$row3['cod'].'** '.$row3['titulo'].' R$ '.Decimal($row3['valorCusto']).' R$ '.Decimal($row3['valorFinal']).'
Categoria: ***'. $row2['nome_categoria'].'***
Ações:
**'.$row3['cod'].'** '.$row3['titulo'].' R$ '.Decimal($row3['valorCusto']).' R$ '.Decimal($row3['valorFinal']).' **'.$row3['cod'].'** '.$row3['titulo'].' R$ '.Decimal($row3['valorCusto']).' R$ '.Decimal($row3['valorFinal']).'
Talvez seja no HTML o problema, e as coisas não estão o lugar certo, por isso ele coloca em baixo, em vez de colocar no meio, acho que é essa "<tr>" sem "<table>";O <table> eu chamo antes de chamar a variável $montatabela, assim:
<table id="datatable-responsive" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%">
<thead>
<?php echo $montatabelatitulo; ?>
</thead>
<tbody>
<?php echo $montatabela; ?>
</tbody>
</table>Então é esse o problema, você ta colocando elementos que não são de tabela dentro da tabela, no caso você escreve isso:
<tbody>
<div class="row" align="center">
<div class="col-lg-6">
<h2>Categoria: <span style="color: #169F85;"><i><b>'. $row2['nome_categoria'].'</b></i></span></h2>
</div>
<div class="col-lg-6 pull-right">
<h2>Ações:
<a href="categoria_form.php?n='.$row2['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row2['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</h2>
</div>
</div>
<tr>
<td class="text-center"><strong>'.$row3['cod'].'</strong></td>
<td class="text-center">'.$row3['titulo'].'</td>
<td class="text-center"><font class="btn btn-xs btn-success">R$ '.Decimal($row3['valorCusto']).'</font></td>
<td class="text-center"><font class="btn btn-xs btn-success">R$ '.Decimal($row3['valorFinal']).'</font></td>
<td class="text-center">
<a href="produtotipo_form.php?n='.$row3['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row3['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</td>
</tr>
</tbody>
Dentro da tabela, ele só interpreta o que está dentro da <tr>, e o que está dentro da <div> fica fora.
Você precisa por o que está na div, dentro de elementos de table, 'tr', 'td', 'th'.Acho que não entendi... esta dizendo pra eu separar a variavel que armazena a categoria da tabela, tipo assim:
$exibe_categoria .='
<div class="row" align="center">
<div class="col-lg-6">
<h2>Categoria: <span style="color: #169F85;"><i><b>'. $row2['nome_categoria'].'</b></i></span></h2>
</div>
<div class="col-lg-6 pull-right">
<h2>Ações:
<a href="categoria_form.php?n='.$row2['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row2['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</h2>
</div>
</div>';
$montatabela.='
<tr>
<td class="text-center"><strong>'.$row3['cod'].'</strong></td>
<td class="text-center">'.$row3['titulo'].'</td>
<td class="text-center"><font class="btn btn-xs btn-success">R$ '.Decimal($row3['valorCusto']).'</font></td>
<td class="text-center"><font class="btn btn-xs btn-success">R$ '.Decimal($row3['valorFinal']).'</font></td>
<td class="text-center">
<a href="produtotipo_form.php?n='.$row3['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row3['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</td>
</tr>';
E depois no html para chama-las:
<div class="row">
<div class="col-lg-3">
<p class="text-muted font-13 m-b-30">
Confira a relação de todas as categorias disponíveis.
</p>
</div>
<div class="col-lg-7 pull-right">
<a type="button" class="btn btn-dark btn-sm" href="categoria_form.php"><i class="glyphicon glyphicon-plus"></i> Criar nova categoria</a>
</div>
<?php echo $exibe_categoria; ?>
<table id="datatable-responsive" class="table table-striped table-bordered dt-responsive nowrap" cellspacing="0" width="100%">
<thead>
<?php echo $montatabelatitulo; ?>
</thead>
<tbody>
<?php echo $montatabela; ?>
</tbody>
</table>
</div>Não não, você inicia a tag <table> certo ?
Dentro dessa tag, só podem conter elementos relacionados a tag table.
[veja](https://www.w3schools.com/html/html_tables.asp)
No seu caso, você está colocando um elemento que não é relacionado ao <table> dentro dele, você não pode colocar uma <div> dentro de um <table>, se essa div não estiver dentro de um elemento, senão ela fica do lado de fora.
Exemplo do que não pode fazer (e é o que ta fazendo):
<table style="width:100%">
<div>
<h1>oi</h1>
</div>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
</tr>
</table>
Essa <div>, ia ficar fora quando a tabela foisse exibida, você precisa pegar essa parte:
$montatabela.='
<div class="row" align="center">
<div class="col-lg-6">
<h2>Categoria: <span style="color: #169F85;"><i><b>'. $row2['nome_categoria'].'</b></i></span></h2>
</div>
<div class="col-lg-6 pull-right">
<h2>Ações:
<a href="categoria_form.php?n='.$row2['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row2['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</h2>
</div>
</div>';
E fazer isso:
$montatabela.='
<tr class="row" align="center">
<td class="col-lg-6">
<h2>Categoria: <span style="color: #169F85;"><i><b>'. $row2['nome_categoria'].'</b></i></span></h2>
</td>
<td class="col-lg-6 pull-right">
<h2>Ações:
<a href="categoria_form.php?n='.$row2['id'].'" class="btn btn-primary btn-xs"><i class="fa fa-edit" data-tip="tooltip" data-original-title="Editar"></i></a>
<a href="#" onClick="javascript:Apagar(\''.$row2['id'].'\');" class="btn btn-danger btn-xs"><i class="fa fa-times" data-tip="tooltip" data-original-title="Apagar"></i></a>
</h2>
</td>
</tr>';
Assim vai funcionar acredito, mas vai ficar desformatado, só formatar daí.Ah sim. Agora compreendi onde estava errando
Deste jeito deu certo aqui, ficou desformatado mesmo mas de boa, só ajeitar aqui.
Muito obrigado mesmo @AnthraxisBR, ajudou muito man!
Não sei se entendi direito, mas pelo que entendi você não vai conseguir direto na query deste modo, você precisa consultar as categorias, listar, e dentro da lista buscar os serviços relacionados a esta categoria.
Alguma coisa como:
while($row = mysqli_fetch_array($rs)){