Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ao realizar uma consulta e montar uma tabela com um loop os resultados são mostrados em linhas na vertical. É possível fazer com que os resultados sejam montados na horizontal?
Exemplificando para tentar passar melhor a minha dúvida:
Eu consigo o resultado assim:
Estado|Marca|Total
SP |VW |10
SP |FIAT |30
SP |MB |15
SP |FORD |28
Eu gostaria de fazer assim:
Estado|VW|FIAT|MB|FORD
SP |10|30 |15|28
Obrigado pela presteza, mas como eu sou iniciante eu não entendi nada...
Amigo deve ter alguma maneira mais fácil mas a única maneira que me veio a cabeça foi esta abaixo.
<?php
$query = mysql_query("SELECT estado FROM suaTabela");
$query2 = mysql_query("SELECT marca FROM suaTabela");
$query3 = mysql_query("SELECT total FROM suaTabela");
?>
<table>
<tr>
<td> estado </td>
<td>
<?php
for($x = 1; $x < = mysql_num_rows($query); $x++){
list($estado) = mysql_fetch_array($query);
echo $estado;
}
?>
</td>
</tr>
<tr>
<td> Marca </td>
<td>
<?php
for($x = 1; $x < = mysql_num_rows($query2); $x++){
list($marca) = mysql_fetch_array($query2);
echo $marca;
}
?>
</td>
</tr>
</tr>
<td> Total </td>
<td>
<?php
for($x = 1; $x < = mysql_num_rows($query3); $x++){
list($total) = mysql_fetch_array($query3);
echo $total;
}
?>
</td>
</tr>
</table>
Mas não aconselharia você a fazer este tipo de listagem tendo em mente que irá passar da tela ao chegar uma certa quantidade de registros criando um scroll na parte inferior do browser.Acho que não consegui explanar bem a minha dúvida! Olha o resultado do seu código:
Estado|SPSPSPSP
Marca|VWFIATMBFORD
Total|10301528
Eu gostaria de fazer assim:
cabeçalho da tabela Estado|VW|FIAT|MB|FORD
resultado da consulta SP|10|30 |15|28
resultado da consulta MG|10|30 |15|28
resultado da consulta RJ|10|30 |15|28
resultado da consulta SC|10|30 |15|28
Pessoal, parece que o que eu preciso se chama crosstab. Pesquisando encontrei aqui o PHP Report Maker que monta a tabela como eu preciso, mas para o resultado abaixo o programa gera vários arquivos e diretórios. Não tem uma forma mais simples de fazer isso?
/applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.us/a/img404/8031/4rpd.jpg&key=1435669697d5f37c2e4748590576741a5b55753fe81ca4b06827a188220535a1" alt="4rpd.jpg" />
SELECT
estado,
SUM(IF(marca = 'FORD',total,0)) AS "Ford",
SUM(IF(marca = 'FIAT',total,0)) AS "FIAT",
SUM(IF(marca = 'MB',total,0)) AS "MB",
SUM(IF(marca = 'VW',total,0)) AS "VW",
SUM(COALESCE(total,0)) as "Total"
FROM
veiculos
GROUP BY 1
resultado na minha tabela de testes
+--------+------+------+------+------+-------+
| estado | Ford | FIAT | MB | VW | Total |
+--------+------+------+------+------+-------+
| PR | 0 | 0 | 20 | 15 | 35 |
| SP | 35 | 105 | 0 | 0 | 140 |
+--------+------+------+------+------+-------+
@braços
Caro hufersil, obrigado pela ajuda. Tem como também inserir uma linha de total para as colunas? Pra exibir o resultado que você postou acima você fez a consulta no console do MySQL, correto? Agora como montar essa tabela no php?
SELECT
estado,
SUM(IF(marca = 'FORD',total,0)) AS "Ford",
SUM(IF(marca = 'FIAT',total,0)) AS "FIAT",
SUM(IF(marca = 'MB',total,0)) AS "MB",
SUM(IF(marca = 'VW',total,0)) AS "VW",
SUM(COALESCE(total,0)) as "Total"
FROM
veiculos
GROUP BY 1
WITH ROLLUP
O ROLLUP irá trazer uma linha totalizadora para cada agrupamento.
Como você só está agrupando por uma coluna, a última linha do resultado virá com o valor de "Estado" = NULL e a soma de cada coluna.
@braços
E como vai ficar o código php para gerar uma tabela como é feito no phpmyadmin?
/applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.us/a/img27/3175/knro.jpg&key=5a38403a2d00a661cb5c9b6ae06e8b6d9c066b3359097d4fb6f2c3d545af6143" alt="knro.jpg" />
[inline]while[/inline] nesse caso não vai dar certo né?
claro que sim ;-)
$sql = <<<SQL
SELECT
estado AS "ESTADO",
SUM(IF(marca = 'FORD',total,0)) AS "FORD",
SUM(IF(marca = 'FIAT',total,0)) AS "FIAT",
SUM(IF(marca = 'MB',total,0)) AS "MB",
SUM(IF(marca = 'VW',total,0)) AS "VW",
SUM(COALESCE(total,0)) as "TOTAL"
FROM
veiculos
GROUP BY 1
WITH ROLLUP
SQL;
$rs = mysql_query($sql) OR die(mysql_error());
// montando o header da tabela
$header = array();
for($i=0, $total=mysql_num_fields($rs); $i<$total; $i++){
$header[] = mysql_field_name($rs, $i);
}
$header_str = '<tr><th>' . implode('</th><th>', $header) . '</th></tr>';
// montando as demais linhas da tabela
$html = '';
while($row = mysql_fetch_assoc($rs)){
$html .= '<tr>';
foreach($row as $key => $value){
if($key == 'ESTADO' && is_null($value)){
$value = 'Total Geral';
}
$html .= '<td>' . $value . '</td>';
}
$html .= '</tr>';
}
// exibindo a tabela final
echo '<table>', $header_str, $html, '</table>';@braços
Deu certinho! Inclusive a substituição de NULL por Total Geral. Veja o resultado:
/applications/core/interface/imageproxy/imageproxy.php?img=http://imageshack.us/a/img837/7659/p4gs.jpg&key=ca5a617bcadc164f5e62ab054022bc004f48c3a541c9a72d496a00bc61bf2100" alt="p4gs.jpg" />
Muitíssimol obrigado por sua ajuda, há muito tempo estava em busca desse resultado. Onde você aprendeu tanto de php? Vou estudar seu código pra ver se consigo entender como funciona a lógica.
Muito do que sei hoje aprendi sozinho.
Estudo PHP já tem mais de 13 anos :)
@braços e fique com Deus!
Ok, então faltam 10 anos pra mim kkkkk... Mais uma vez obrigado. Grande abraço.
hufersil você salvou minha vida , procurei por muito tempo mas sua resposta foi a melhor com o código menor .
Sim amigo a ordem de exibição na tela você quem escolha ao utilizar a variável.