分组Mysql PHP查询结果

时间:2015-01-29 19:10:00

标签: php mysql

我有一个基本的PHP页面,可以在MySQL数据库中搜索复古的ZX Spectrum杂志文章。

地址是[www.retroresource.co.uk] [1]

PHP结果页面很好,因为它产生了结果,但我希望能够通过'fgames.fgname'对结果进行分组

例如,如果我搜索Dizzy

Dizzy(作为标题)

包含fgames.fgname = Dizzy

的行的表

Spindizzy(作为标题)

包含fgames.fgname = Spindizzy

的行的表

Treasure Island Dizzy(作为标题)

包含fgames.fgname = Treasure Island Dizzy

的行的表

等等

我用Google搜索并查看了我的一些教科书,但我无法看到解决方案。任何帮助非常感谢。

彼得

协助后的修订守则(虽然没有结果)

<?php 

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


require( '../connect_db.php' ) ;

$query = $_GET['query']; 


$min_length = 4;
// you can set minimum length of the query if you want

$query = strip_tags($query); 

$query = mysqli_real_escape_string ($dbc,$query);


$q = "SELECT fgames.fgname, fgames.fgprorg, fgames.fgprbud, fgames.fgratng, fgames.fgprdsk, ftypes.fttname, frefs.fryymm, frefs.frpage, frefs.frissue, fmagzne.fmname, frefcde.ffname
FROM fgames, ftypes,frefs, fmagzne,frefcde
WHERE ftypes.fttype = fgames.fgtype
and   fgames.fglink = frefs.frlink2
and   frefs.frentry = frefcde.ffentry
and   frefs.frmag = fmagzne.fmmag 
and   fgames.fgname LIKE '%".$query."%'
order by fgames.fgname ASC" ;

$r = mysqli_query( $dbc , $q ) ;


$current_group = '';
while ( $row = mysqli_fetch_array( $r , MYSQLI_ASSOC ) ) 

{
    if($row['fgames.fgname']) !== $current_group) 

{

       if($current_group !== '') 
{
           echo '</table>';
}
      $current_group = $row['fgames.fgname'];

      echo '<table><tr><th>FGNAME</th><th>FGPRORG</th><th>FGRBUD</th><th>FGRATNG</th><th>FGRDSK</th>
      <th>FTTTNAME</th><th>FRYYMM</th><th>FRPAGE</th><th>FRISSUE</th><th>FMNAME</th><th>FFNAME</th></tr>';

}
 echo '<tr><td>'.$row['fgname'].'</td><td>'.$row['fgprorg'].'</td><td> '.$row['fgprbud'].' </td><td>'.$row['fgratng'].' </td>            <td>'.$row['fgprdsk'].' </td><td>'.$row['fttname'].'</td><td> '.$row['fryymm'].'</td><td> '.$row['frpage'].'</td><td> '.$row['frissue'].' </td> <td>'.$row['fmname'].' </td><td>'.$row['ffname'].'</td></tr>';

}

echo '</table>';

else
{
  echo '<p>' . mysqli_error( $dbc ) . '</p>'  ;
}








# Close the connection.
mysqli_close( $dbc ) ;
?>

1 个答案:

答案 0 :(得分:0)

有两种基本方法。

将查询数据加载到二维数组中,并使用嵌套循环输出,如下所示:

$array_for_output = array();
while($row = /* your query fetch mechanism here */) {
    $array_for_output[$row['field_you_are_grouping_on']] = $row;
}

foreach($array_for_output as $table_name => $table_data) {
    // output table header here
    foreach($table_data as $table_row) {
        // output individual row
    }
    // output table closure here
}

或者另一种方法是在您尝试分组的字段上使用ORDER BY子句进行查询,并在单个循环中检测当前组中的更改

$query = "
SELECT ...
FROM ...
WHERE ...
ORDER BY field_you_are_grouping_on, any_secondary_ordering_field_here ASC";

// execute query here

$current_group = '';
while ($row = /* your query fetch mechanism here */) {
    if($row['field_you_are_grouping_on']) !== $current_group) {
       // we have started a new group
       if($current_group !== '') {
           // this is not first table
           // so output closure to previous table here
       }
       $current_group = $row['field_you_are_grouping_on'];
       // output new table header here
    }
    // output row data here
}
// output closure to final table here

从内存管理的角度来看,第二种方法通常是优选的(您不必在任何时候将整个结果集存储在内存中),但是一些初级开发人员可能不会发现这不像第一种方法那样直观。如果要获取完整的结果集并将其注入某种用于呈现显示的模板,第一种方法也可能更合适。