PHP从五个不同的表中以正确的顺序检索信息

时间:2018-09-17 17:56:51

标签: php mysql sql database

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

我的问题是我无法订购消息。我的意思是我无法弄清楚如何制作一条SQL语句来返回所有消息并按ID进行排序。我编写的代码是这样的:

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

结果与我想要的结果不同。具体来说,首先显示的是学生的信息,然后是工作人员的信息。我的问题是,是否有任何查询可以将所有这四个表基本上合并为一个,并且所有消息将以正确的顺序显示?例如通过ID? 预先谢谢你!

1 个答案:

答案 0 :(得分:2)

首先,使用JOIN获取与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