MYSQL和PHP按字段数据分组结果

MYSQL和PHP按字段数据分组结果,php,arrays,loops,group-by,mysqli,Php,Arrays,Loops,Group By,Mysqli,我正在尝试根据数据库中日志中的数据创建报告,如下所示: id|学生|类型|分数 123494 CAT150 23495 CAT1 20 323494 CAT2 35 42395期中考试40 到目前为止,我的select语句如下所示: $res = @mysqli_query ($dbc, "SELECT id, student, type, GROUP_CONCAT(marks) AS mark, GROUP_CONCAT(type) AS types FROM log WHERE class

我正在尝试根据数据库中日志中的数据创建报告,如下所示:

id|学生|类型|分数
123494 CAT150
23495 CAT1 20
323494 CAT2 35
42395期中考试40

到目前为止,我的select语句如下所示:

$res = @mysqli_query ($dbc, "SELECT id, student, type, GROUP_CONCAT(marks) AS mark, GROUP_CONCAT(type) AS types FROM log WHERE class = '1' AND term = '2' GROUP BY student DESC");

// Fetch and print all the records....<br>
while ($row = mysqli_fetch_array($res, MYSQLI_ASSOC)) {

        echo '<tr>
            <td align="left">'. $row['student'] .'</td>';

        //$exams = split(",", $row['exams']); // 4,3,1,2
        $marks = split(",", $row['mark']); // 10,20,40,50

        foreach( $marks as $mark ) {
             echo '
                   <td align="left">' . $mark . '</td>
                ';
        }

        echo '</tr>';

} //End LOOP

//Then i end table
$res=@mysqli_query($dbc,“从日志中选择id、student、type、GROUP_CONCAT(标记)作为标记,GROUP_CONCAT(type)作为类型,其中class='1'和term='2'按student DESC分组”);
//获取并打印所有记录……
而($row=mysqli\u fetch\u数组($res,mysqli\u ASSOC)){ 回声' “.$行[“学生]”; //$TEAMS=拆分(“,”,$row['TEAMS']);//4,3,1,2 $marks=split(“,”,$row['mark']);//10,20,40,50 foreach($marks作为$mark){ 回声' “.$马克。” '; } 回声'; }//结束循环 //然后我结束了这张桌子
到目前为止,数据显示如下:

学生|第一类|第二类|期中考试
234945035
234952040

问题是代码没有按照“类型”排列“标记”(查看id 4和相应显示的中期输出)

问题:

如何按学生显示结果,然后在相应的单元格/组中显示分数,如:

学生|第一类|第二类|期中考试
234945035
234952040


提前感谢各位。

首先,尽量让逻辑远离布局。通常,最好先收集所需的数据,然后再显示

使用
GROUP\u CONCAT
会让事情变得更复杂,因为你不知道每个学生会得到多少结果,也不知道哪些分数属于哪种类型

考虑到这一点,我创建了一个解决方案。当然,您仍然需要扩展查询

$query = 'SELECT student, type, marks FROM log';
$res = mysqli_query($query);
$studentMarks = array();

while ($row = mysqli_fetch_array($res, MYSQLI_ASSOC))
{
    $studentMarks[$row['student']][$row['type']] = $row['marks'];
}

// Now $studentMarks should look like:
// $studentMarks = array(
//    23494 => array('CAT1' => 50, 'CAT2' => 35)
//  , 23495 => array('CAT1' => 20, 'MIDTERM' => 40)
// );    

echo '<table><thead><tr>';
echo '<td>Student</td><td>CAT1</td><td>CAT2</td><td>MIDTERM</td>';
echo '</tr></thead><tbody>';

foreach($studentMarks as $studentId => $marks)
{
    echo '<tr>';
    echo '<td>', $studentId, '</td>';
    echo '<td>', (isset($marks['CAT1']) ? $marks['CAT1'] : '&nbsp;'), '</td>';
    echo '<td>', (isset($marks['CAT2']) ? $marks['CAT2'] : '&nbsp;'), '</td>';
    echo '<td>', (isset($marks['MIDTERM']) ? $marks['MIDTERM'] : '&nbsp;'), '</td>';
    echo '</tr>';
}
echo '</tbody></table>';
$query='SELECT student,type,marks FROM log';
$res=mysqli\u查询($query);
$studentMarks=array();
而($row=mysqli\u fetch\u数组($res,mysqli\u ASSOC))
{
$studentMarks[$row['student'][$row['type']]=$row['marks'];
}
//现在$studentMarks应该如下所示:
//$studentMarks=数组(
//23494=>阵列('CAT1'=>50,'CAT2'=>35)
//,23495=>阵列('CAT1'=>20,'中期'=>40)
// );    
回声';
echo“学生CAT1CAT2Midterm”;
回声';
foreach($studentMarks作为$studentId=>$marks)
{
回声';
echo“”,$studentId“”;
回声“”,(isset($marks['CAT1'])?$marks['CAT1']:'','';
回声“”,(isset($marks['CAT2'])?$marks['CAT2']:'','';
回音“”,(isset($marks['MIDTERM'])?$marks['MIDTERM']:'','';
回声';
}
回声';

感谢您的回复@Arjan,我目前正在测试您的逻辑。虽然我第一次使用您的代码进行测试只返回$studentId。让我再探讨一下,我会回复你的。我仍然无法让你的逻辑显示与类型相关的标记。还有其他想法吗?我不知道为什么代码似乎不起作用。为了安全起见,我在代码中添加了一些注释行,以显示
$studentMarks
应该是什么样子(基于问题)。当它看起来像这样时,代码就会工作。如果您不理解部分代码,请解释哪些部分需要澄清,我会提供。非常感谢。我能让你的代码正常工作。最初我在foreach输出时迷失了方向,但这只是我集成数据库时的一个错误。我现在可以放心地说问题已经解决了。干杯