首页 > 解决方案 > 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>

标签: phpmysqldatabasemysqlidatabase-design

解决方案


您的架构基本上是错误的,并且您的代码包含一个嵌套查询,这几乎总是错误的做事方式。

而不是三个相同的表具有不同的课程数据,设置一个表并添加一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();

?>

演示:https ://www.db-fiddle.com/f/3cmTkGhEgiBEUZS7dFNvnz/0


推荐阅读