【发布时间】:2018-05-08 18:20:09
【问题描述】:
我有一个关于在另一个查询中嵌套 MySQLi 查询可能是相当基本的问题。我不确定这是否是最佳做法,如果有人可以通过让我知道下面的示例是否运行良好或是否有更好的方法来提供帮助,我将不胜感激。
表 1:学生
id | linked_teacher | student_name | student_age
1 | 1 | Bob Eaves | 15
2 | 1 | Ellen Robs | 11
3 | 2 | Will Tops | 7
4 | 3 | Scott Long | 13
表 2:教师
id | teacher_name
1 | Mrs Green
2 | Mr Wood
3 | Dr Grey
4 | Professor Long
我的 PHP 现在如下所示:
$sql = "SELECT linked_teacher, student_name, student_age FROM students";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$linked_teacher = $row["linked_teacher"];
$sql2 = "SELECT teacher_name FROM teachers WHERE teacher_name = $linked_teacher";
$result2 = $conn->query($sql2);
if ($result2->num_row > 0) {
while($row2 = $result2->fetch_assoc()) {
$teacher_name = $row2["teacher_name"];
}
}
echo "$row["teacher_name"]. " - ". $row["student_name"]. " - " . $row["student_age"]";
}
}
这将输出以下内容:
Mrs Green - Bob Eaves - 15
Mrs Green - Ellen Robs - 11
Mr Wood - Will Tops - 7
Dr Grey - Scott Long - 13
虽然我很欣赏我的示例实际上并不需要两张表,但如果我能理解回答此示例的正确方法,我确信我在我的解决方案中没有这样做,那么我可以将该理论应用于更复杂的解决方案。
提前致谢。
【问题讨论】:
-
您需要学习如何使用
JOIN。这应该包含在任何 SQL 入门书籍或教程中。 -
警告:当使用
mysqli时,您应该使用parameterized queries 和bind_param将用户数据添加到您的查询中。 请勿使用字符串插值或连接来完成此操作,因为您创建了一个严重的SQL injection bug。 切勿将$_POST、$_GET或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。 -
这是一个 N+1 查询情况,正如比尔所说,您可以通过使用
LEFT JOIN预取来避免这种情况。我认为你在这里有一个潜在的问题,因为你使用老师的名字作为外键。这些不够独特并且可能会发生变化,从而导致错误链接的数据。最好使用固定标识符,例如教师员工 ID 或一些自行生成的号码。