首页 > 解决方案 > PHP以正确的顺序从五个不同的表中检索信息

问题描述

我开发了一个聊天系统,学生和教职员工可以在其中交换不同的信息。我开发了一个数据库,其中有五个表:staff 表、student、message 和两个映射表 Staff_message 和 stu_message。这些表仅包含学生/员工 ID 和消息 ID。

我的问题是我无法订购消息。我的意思是我无法弄清楚如何创建一个返回所有消息并按例如 ID 排序的 SQL 语句。我所做的代码是这样的:

$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>";             
    }   
}
?>  

结果和我想要的不一样。更具体地说,首先显示来自学生的信息,然后是来自工作人员的信息。我的问题是,是否有任何查询可以基本上将所有这四个表合二为一,并且所有消息都将以正确的顺序显示?例如通过身份证?先感谢您!

标签: phpmysqlsqldatabase

解决方案


首先,用于获取与orJOIN对应的用户名,以及消息的文本,而不是单独查询。stu_idstaff_id

然后使用UNION将两个查询组合成一个查询,然后您可以使用ORDER BY.

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

推荐阅读