PHP以正确的顺序从五个不同的表中检索信息
我开发了一个聊天系统,学生和员工可以在其中交换不同的信息。我开发了一个数据库,其中有五个表:staff表、student表、message表和两个映射表staff_消息和stu_消息。这些表仅包含学生/员工id和消息id 我的问题是我无法对邮件进行排序。我的意思是,我不知道如何生成一条SQL语句,该语句将返回所有消息并按ID排序。我生成的代码如下:PHP以正确的顺序从五个不同的表中检索信息,php,mysql,sql,database,Php,Mysql,Sql,Database,我开发了一个聊天系统,学生和员工可以在其中交换不同的信息。我开发了一个数据库,其中有五个表:staff表、student表、message表和两个映射表staff_消息和stu_消息。这些表仅包含学生/员工id和消息id 我的问题是我无法对邮件进行排序。我的意思是,我不知道如何生成一条SQL语句,该语句将返回所有消息并按ID排序。我生成的代码如下: $qu = mysqli_query($con,"SELECT * FROM stu_message"); while($row7 = mysqli
$qu = mysqli_query($con,"SELECT * FROM stu_message");
while($row7 = mysqli_fetch_assoc($qu)){
$que = mysqli_query($con, "SELECT * FROM student WHERE studentid =".$row7['stu_id']);
while($row8 = mysqli_fetch_assoc($que)) {
$username = $row8['username'];
}
$query3 = mysqli_query($con, "SELECT * FROM message WHERE id=".$row7['mid']);
while($row6 = mysqli_fetch_assoc($query3)) {
echo $row6['date']."<strong> ".$username."</strong> ".$row6['text']."<br>";
}
}
$query2 = mysqli_query($con, "SELECT * FROM staff_message");
while($row3 = mysqli_fetch_assoc($query2)){
$query = mysqli_query($con, "SELECT * FROM staff WHERE id =".$row3['staff_id']);
while($row5 = mysqli_fetch_assoc($query)) {
$username = $row5['username'];
}
$query3 = mysqli_query($con, "SELECT * FROM message WHERE id=".$row3['m_id']);
while($row6 = mysqli_fetch_assoc($query3)) {
echo $row6['date']."<strong> ".$username."</strong> ".$row6['text']."<br>";
}
}
?>
$qu=mysqli_查询($con,“从stu_消息中选择*);
而($row7=mysqli\u fetch\u assoc($qu)){
$que=mysqli_query($con,“从studentid=“.row7['stu_id')的学生中选择*);
而($row8=mysqli\u fetch\u assoc($que)){
$username=$row8['username'];
}
$query3=mysqli_query($con,“从消息中选择*,其中id=”.$row7['mid']);
而($row6=mysqli\u fetch\u assoc($query3)){
echo$row6['date'].“”$username.“$row6['text'.”
”;
}
}
$query2=mysqli_query($con,“从员工信息中选择*);
而($row3=mysqli\u fetch\u assoc($query2)){
$query=mysqli_query($con,“从员工中选择*,其中id=”.$row3['staff_id'));
while($row5=mysqli\u fetch\u assoc($query)){
$username=$row5['username'];
}
$query3=mysqli_query($con,“从消息中选择*,其中id=”.$row3['m_id']);
而($row6=mysqli\u fetch\u assoc($query3)){
echo$row6['date'].“”$username.“$row6['text'.”
”;
}
}
?>
结果与我想要的不同。更具体地说,首先显示来自学生的信息,然后是来自工作人员的信息。我的问题是,是否有任何查询可以将这四个表基本合并到一个表中,并且所有消息都将以正确的顺序显示?例如通过id?
提前谢谢你 首先,使用
JOIN
获取与stu\u id
或staff\u id
对应的用户名和消息文本,而不是单独查询
然后使用UNION
将两个查询组合成一个查询,然后可以使用orderby
进行排序
SELECT u.id, u.text, u.username
FROM (
SELECT s.username, m.text, m.id
FROM message AS m
JOIN stu_message AS sm ON m.id = sm.mid
JOIN student AS s ON s.id = sm.stu_id
UNION ALL
SELECT s.username, m.text, m.id
FROM message AS m
JOIN staff_message AS sm ON m.id = sm.m_id
JOIN staff AS s ON s.id = sm.staff_id
) AS u
ORDER BY u.id
首先,使用
JOIN
获取与stu\u id
或staff\u id
对应的用户名和消息文本,而不是单独查询
然后使用UNION
将两个查询组合成一个查询,然后可以使用orderby
进行排序
SELECT u.id, u.text, u.username
FROM (
SELECT s.username, m.text, m.id
FROM message AS m
JOIN stu_message AS sm ON m.id = sm.mid
JOIN student AS s ON s.id = sm.stu_id
UNION ALL
SELECT s.username, m.text, m.id
FROM message AS m
JOIN staff_message AS sm ON m.id = sm.m_id
JOIN staff AS s ON s.id = sm.staff_id
) AS u
ORDER BY u.id
关于设计的一个想法:为什么有两张桌子供教职员工和学生使用?您可以创建一个表来容纳他们,然后在该表中创建一个标志以将他们标识为教职员工和学生。然后,您只需要一个表来处理这个问题,一个表来处理消息。然后,您可以通过该标志追溯到来自学生/员工的消息。那么,这也可以解决您的问题,更好地进行总体数据库设计。为什么要使用
while
循环来获取用户名?只有一个学生或教职员工有一个特定的ID,对吗?看起来你实际上有五张桌子,而不是四张。@Brad首先感谢你的回答,我可以理解你的观点,但将来教职员工会做出与学生不同的事情。例如,教职员工可以插入新学生,或者可以上传文本,其中每个教职员工id将与文本关联。我不知道将所有内容都放在一个表中是否正确,学生和教职员工以及所有内容都将取决于“角色”属性。注意:mysqli
的面向对象界面明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql\u查询
接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:$db=new mysqli(…)
和$db->prepare(“…”)
过程接口是PHP4时代的产物,当时引入了mysqli
API,不应在新代码中使用。关于设计的一个想法是,为什么员工和学生有两个表?您可以创建一个表来容纳他们,然后在该表中创建一个标志以将他们标识为教职员工和学生。然后,您只需要一个表来处理这个问题,一个表来处理消息。然后,您可以通过该标志追溯到来自学生/员工的消息。那么,这也可以解决您的问题,更好地进行总体数据库设计。为什么要使用while
循环来获取用户名?只有一个学生或教职员工有一个特定的ID,对吗?看起来你实际上有五张桌子,而不是四张。@Brad首先感谢你的回答,我可以理解你的观点,但将来教职员工会做出与学生不同的事情。例如,教职员工可以插入新学生,或者可以上传文本,其中每个教职员工id将与文本关联。我不知道将所有内容都放在一个表中是否正确,学生和教职员工以及所有内容都将取决于“角色”属性。注意:mysqli
的面向对象界面明显不那么冗长,使代码更易于阅读和审核,并且不容易与过时的mysql\u查询
接口混淆。在你对程序性风格投入太多之前,值得换一种。示例:$db=new mysqli(…)
和$db->prepare(“…”)
过程接口是PHP 4时代引入mysqli
API时的产物,不应在新代码中使用。感谢您的回答。我不想惹人生气,但“u.id”、“u.id”或“u.message”是消息表中的属性吗?如果是,则我必须删除u.username,因为此表中没有任何名称大于的属性。提前谢谢你<代码>u是子系统的别名