MYSQL и PHP группируют результаты по полевым данным - PullRequest
0 голосов
/ 07 августа 2011

Я пытаюсь создать отчеты на основе данных из журнала в базе данных, который выглядит следующим образом:

id |студент |тип |Метки1 23494 CAT1 502 23495 CAT1 203 23494 CAT2 354 23495 MIDTERM 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

Пока данные отображаются так:

STUDENT |CAT1 |CAT2 |Среднесрочный23494 50 3523495 20 40

Проблема в том, что код не размещает «метки» в соответствии с «типом» (посмотрите на вывод MIDTERM для идентификатора 4 и соответствующего дисплея).

Вопрос:

Как отобразить результаты по учащимся, за которыми следуют отметки в соответствующей ячейке / группе, например:?

СТУДЕНТ |CAT1 |CAT2 |Среднесрочный23494 50 3523495 20 40

Спасибо заранее, ребята.

1 Ответ

1 голос
/ 08 августа 2011

Во-первых, старайтесь держать логику подальше от макета.Как правило, рекомендуется сначала собрать необходимые данные, а затем отобразить их.

Использование GROUP_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>';
...