Двойной ключ преобразует набор результатов PHP в таблицу HTML

#php #javascript #html

#php #javascript #HTML

Вопрос:

У меня есть набор результатов, который суммирует итоги для N ситуаций и N разных кодов за определенный период.

Данные поступают из этого SQL

 SELECT *, count(fldA) as ca 
FROM table 
WHERE ('... month/year ...') 
GROUP BY Sit, Cod 
ORDER BY count(fldA) DESC;
  

Хорошо, вот таблица, которую я хочу:

  -------------------------------- 
| d/l | Sit. A | Sit. B | Sit. N |
 ----- -------- -------- -------- 
| c91 |   10   |   05   |   10   |
 ----- -------- -------- -------- 
| c93 |   15   |        |        |
 ----- -------- -------- -------- 
| cN. |   07   |   01   |        |
 ----- -------- -------- -------- 
| Tot |   22   |   06   |   10   |
 -------------------------------- 
  

Таким образом, соответствующий массив (resultset) для приведенной выше таблицы должен быть чем-то вроде:

 SitA, C93, 15;
SitN, c91, 10;
SitA, c91, 10;
SitA, CN., 07;
SitB, c91, 05;
SitB, cN., 01;
  

Обратите внимание, что количество ситуаций (столбцов) и кодов (строк) БУДЕТ ОТЛИЧАТЬСЯ. И бывают случаи, когда в массиве результирующего набора не должно быть значения для некоторой комбинации строк col x.

Очевидно, что итоговые данные должны быть рассчитаны впоследствии.

Вопрос в том … какой наилучший подход для такого типа результирующего набора => создание таблицы? Предпочтительно использовать только один SQL-запрос.

Ответ №1:

Итак, поскольку помощь не приходит… я сделал это

 <?php
  

 $sql="";

function timeFilter(){
    $q="";
    if ($_GET['mes']!='' || $_GET['ano']!=''){ $q.=" WHERE";}
    if ($_GET['mes']!=''){ $q.=" MONTH(ouventrada)=$_GET[mes]";}
    if ($_GET['mes']!='' amp;amp; $_GET['ano']!=''){ $q.=" AND";}
    if ($_GET['ano']!=''){$q.=" YEAR(ouventrada)=$_GET[ano]";}
    return $q;
}   

// we gonna use two buffers for collumns and rows...

function fillBuff (amp;$buff, $fld){
    $buff = array();
    $sql = "SELECT $fld FROM ouv" . timeFilter() . " GROUP BY $fld";
    $res = mysql_query($sql);
    while ($row=mysql_fetch_assoc($res)){
        $buff[]=$row[$fld];
    }
}

$quad .= "<div id='stats'>";

// Fill buffers
$buffatc  = array();
$bufftipo = array();
fillBuff ($buffatc,  'ouvatc');
fillBuff ($bufftipo, 'ouvtipo');

// Table headers
$tbl = "<table class='resumo'>";
$tbl.= "<thead><tr><th></th>";
foreach ($bufftipo as $l){ 
    $tbl.="<th>$l</th>";
}
$tbl.="</tr></thead>";

// Table foot (Totals)
$tbl.="<tfoot><tr style='background-color: #f0f0f0'><td style='font-size: 50%;'>Total</td>";
foreach($bufftipo as $l){
    $sql="SELECT  count(*) AS ca FROM ouv" . timeFilter();
    $sql.= (strpos($sql,"WHERE"))?" AND":" WHERE";
    $sql.=" ouvtipo='$l'";
    $rowt = mysql_fetch_assoc(mysql_query($sql));
    $tbl.="<td style='font-weight: bold'>$rowt[ca]</td>";
}
$tbl.="</tfoot>";

// Table Body
$tbl.="<tbody>";
foreach ($buffatc as $r){ //data
    $tbl.="<tr>";
    $tbl.="<td style='font-size: 50%;'>$r</td>";
    foreach($bufftipo as $l){
        $sql="SELECT count(*) as ca FROM ouv " . timeFilter();
        $sql.= (strpos($sql,"WHERE"))?" AND":" WHERE";
        $sql.=" ouvatc='$r' AND ouvtipo='$l'";
        $rowt = mysql_fetch_assoc(mysql_query($sql));
        $tbl.="<td style='font-weight: bold'>$rowt[ca]</td>";
    }
    $tbl.="</tr>";
}
$tbl.="</tbody>";
$tbl .="</table>";

$quad.= $tbl;

$quad.= "</div>";
  

Мы взаимодействуем через два «буфера» для столбцов и строк, устанавливая sql для вычисления каждой ячейки за раз…

gl, спасибо

Paulo Bueno.