php - PHP MySQL根据列/行值选择多个表
问题描述
我只是根据我的“学生”表的值对一些我试图关联在一起的表进行一些测试。
这是我拥有的总表:
学生表
id, name, course_num, msg_num
生物表
id,详细信息,msg_num
化学表
id,详细信息,msg_num
物理表
id,详细信息,msg_num
所以我试图首先选择'students'表,并根据'students'表中的'course_num'和'msg_num'值,它将确定从我拥有的表数组中选择哪个表(如上所示,“生物学”、“化学”和“物理学”表)。
因此,我再次尝试将其设置为如果 'students' 表中的 'course_num' 中的数字设置为 '0,1,2' ,那么它将从数组中动态选择相关表我提前设置的列表。这是我在下面尝试过的确切代码,但它没有正确同步。请让我知道我在这里做错了什么:
<div style="position:relative; margin:auto; width:400px; font-family:Poppins; font-size:16px; border:2px solid black; padding:10px; margin-top:100px;">
<?php
include 'db_connect.php';
$selected_courses = array("biology", "chemistry", "physics");
$sql1 = "SELECT * FROM students";
$result1 = $conn->query($sql1);
while($row1 = $result1->fetch_assoc()){
$course = $selected_courses[$row1['course_num']];
$sql2 = "SELECT students.*, $course.*, FROM students, $course
WHERE students.msg_num = $course.msg_num";
$result2 = $conn->query($sql2);
$row2 = $result2->fetch_assoc();
echo "STUDENT NAME: ". $row2['name'] . "<br>";
echo "DETAILS: ". $row2['details'] . "<br>";
echo "MSG NUM: ". $row2['msg_num'] . "<br>";
echo "<br>";
}
$conn->close();
?>
</div>
解决方案
您的架构基本上是错误的,并且您的代码包含一个嵌套查询,这几乎总是错误的做事方式。
而不是三个相同的表具有不同的课程数据,设置一个表并添加一course_num
列。这允许您JOIN
直接向您的学生提供他们的详细信息行,并且您可以使用单个SELECT
与 aJOIN
来提取数据。
所以使用你的学生表和这个 courseDetails 表:
CREATE TABLE `courseDetails` (
`id` int NOT NULL AUTO_INCREMENT,
`msg_num` int NOT NULL,
`course_num` int NOT NULL,
`details` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;
您可以像这样在两个表之间的公共列上加入:
select name, details, s.msg_num
from students s
join courseDetails d
on (s.course_num = d.course_num AND s.msg_num = d.msg_num);
要在单个查询中获取此输出:
姓名 | 细节 | msg_num |
---|---|---|
亚当·斯密 | 生物学细节 #0 | 0 |
约翰·赖特 | 化学详情 #1 | 1 |
从中,您可以改变 JOIN 条件并使用 WHERE 子句根据需要创建不同的输出,所有这些都来自两个基本表。
这将您的 PHP 代码简化为
include 'db_connect.php';
$sql1 = "select name, details, s.msg_num from students s join courseDetails d on (s.course_num = d.course_num AND s.msg_num = d.msg_num);";
$result1 = $conn->query($sql1);
while($row1 = $result1->fetch_assoc()){
echo "STUDENT NAME: ". $row1['name'] . "<br>";
echo "DETAILS: ". $row1['details'] . "<br>";
echo "MSG NUM: ". $row1['msg_num'] . "<br>";
echo "<br>";
}
$conn->close();
?>
推荐阅读
- dart - 如何检查 RefreshIndicator 状态以根据其状态值采取行动?
- android - 即使应用程序关闭,如何将 lat long 发送到服务器
- python - Python 3,无法重置登录代码的变量
- rest - http GET中的ClientException“无效的响应原因短语”
- java - java中按位&运算符的时间复杂度是多少?
- python - 从 Beautiful Soup 中提取链接
- javascript - 如何将 .js 文件分解为不同的文件,如 PHP 的包含(或要求),这样我就不必使用命名空间
- ionic-framework - 每天开始特定日期的离子本地通知
- javascript - 如何让用户自定义通知条件?
- html - 如何创建 SVG 图标以及如何在 Web 应用程序上实现?