我开发了一个聊天系统,学生和教职员工可以交换不同的消息。我已经开发了一个数据库,其中有五个表:人员表,学生,消息和两个映射表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? 预先谢谢你!
答案 0 :(得分:2)
首先,使用JOIN
获取与stu_id
或staff_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