Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP以正确的顺序从五个不同的表中检索信息_Php_Mysql_Sql_Database - Fatal编程技术网

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

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

我开发了一个聊天系统,学生和员工可以在其中交换不同的信息。我开发了一个数据库,其中有五个表:staff表、student表、message表和两个映射表staff_消息和stu_消息。这些表仅包含学生/员工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>";             
    }   
}
?>  
$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是子系统的别名