php - 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
)
)
)
解决方案
您将无法使用 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']
];
}
推荐阅读
- apollo-client - notifyOnNetworkStatusChange 究竟做了什么?
- c - 浮点到整数的转换舍入而不是截断
- javascript - 如何将 react-leaflet 地图定位到用户的当前位置并获取该地图的边框?
- javascript - 当我的表单字段出错并重新加载时,如何让我的表单字段保持显示在页面上?
- php - 将活动添加到祖父母和父母
- python - Python正则表达式替换命令行中的特定文件名(不是扩展名)
- javascript - 当我尝试反转图像时出现 Interactjs 问题
- java - 如何将 Java 的日期字符串/对象转换为 JFreeChart 的日期格式?
- java - ConcurrentLinkedQueue 和 poll()
- .net - EF Core 5 嵌套投影问题