首页 > 解决方案 > SQL查询组合

问题描述

如何使用一个查询获得以下代码的相同数据?不使用多个请求。

我不想使用多个数据库请求。

$result = "SELECT classid FROM student_result_history WHERE s_id = 11 GROUP BY class_name";

foreach($result as $row){
  $classid = $row["classid"];
  $result2 = "SELECT term FROM student_result_history WHERE class_name = $classid GROUP BY term";

  foreach($result2 as $row2){
    $term = $row2["term"];
    $result3 = "SELECT subject_name, primary_mark, secondary_mark, practical_mark FROM student_result_history WHERE term = '$term' AND class_name = '$classid' AND s_id = 11";

    foreach($result3 as $row3){
        print_r($row3);
    }   
  } 
}

我想要嵌套数组中的结果

array(
    array( /*class_name 1*/
        array( /*term 1*/
            'subject_name' => 'abc',
            'secondary_mark' => 12,
            'practical_mark' => 30
        ),
        array( /*term 2*/
            'subject_name' => 'bcd',
            'secondary_mark' => 32,
            'practical_mark' => 20
        )
    ),
    array( /*class_name 2*/
        array( /*term 1*/
            'subject_name' => 'abc',
            'secondary_mark' => 42,
            'practical_mark' => 20
        ),
        array( /*term 2*/
            'subject_name' => 'bcd',
            'secondary_mark' => 32,
            'practical_mark' => 20
        )
    )
)

标签: phpsqldatabase

解决方案


您将无法使用 SQL 创建嵌套的 PHP 数组。无论您的查询做什么,它只会返回行,您必须在 PHP 中操作它们以获取嵌套结构。由于您需要的所有内容都在同一个表中,因此实际上不需要使查询变得如此复杂。

只需选择您想要的所有列,无需分组。

SELECT class_name, term, subject_name, primary_mark, secondary_mark, practical_mark 
FROM student_result_history WHERE s_id = 11

然后在获取结果时在 PHP 中创建嵌套结构。

while ($row = $query->fetch()) {
    $result[$row['class_name']][$row['term']] = [
        'subject_name' => $row['subject_name'],
        'secondary_mark' => $row['secondary_mark'],
        'practical_mark' => $row['practical_mark']
    ];
}

推荐阅读