【问题标题】:selecting the latest record from multiple tables in one database (MYSQL PHP)从一个数据库中的多个表中选择最新记录(MYSQL PHP)
【发布时间】:2014-05-27 10:00:33
【问题描述】:

我有学校 mysql 数据库,有 15 个表(15 个教室),每个表都有统一的字段/简单数据,例如:ID、DATE、TIME、CLASSROOM_NO、STUDENTS_ALL、STUDENTS_CURRENT、COMMENTS

方法是能够通过增加该数据库的php表单一直更新这些数据,这很好,它工作正常。

在另一个 php 页面中,我有 display.php,它只显示添加的最新记录,所以我可以知道这个教室的最新更新,这也很好,正是我需要的,这是我的代码:

<?php
$con=mysqli_connect("localhost","classroom","mypsassword","mysqluser");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$result = mysqli_query($con,"SELECT id, date, time, classroom_no, students_all,     student_current,comments FROM classroom_1 ORDER BY id DESC LIMIT 1");


while($row = mysqli_fetch_array($result))
 {

 echo "<b>Room:</b> " . $row['classroom_no'] . "<br>";
 echo "<b>All students:</b> " . $row['students_all'] . "<br>";
 echo "<b>Available students:</b> " . $row['students_current'] . "<br>";
 echo "<b>Absent:</b> ";
 echo floatval($row['students_all'])  -  floatval($row['students_current']);
 echo "<br>";
 echo "<b>Updated on:</b> " . $row['date'] ."<br>";
 echo "<b>Update time:</b> " . $row['time']."<br>" ;

  }

mysqli_close($con);

?>

现在,我在一个页面中实现和检索每个教室的最新更新没有问题......我努力的是从每个表中选择最新记录,然后在同一页面中相应地显示它们。 . 所以要有一个php页面说all_classrooms.php

并在一页中显示所有教室(仅每个表的最新记录更新),因此我无法理解如何同时从所有表中选择 sql 查询并将其限制为最新记录...

我的表按如下顺序排列: 教室_1 教室_2 classrrom_3

请指教

【问题讨论】:

  • 我建议您规范您的数据库设计。将所有教室数据放入一个带有列的表格中,以显示任何特定行与哪个教室相关。
  • 为什么 15 个教室有 15 张桌子?您应该有三张表 - 课堂信息、学生、预订(或适当的名称)
  • 那么每个表都有一个 CLASSROOM_NO 列并且每个表在每个表的该列中都有所有相同的数据?
  • 是的 LIUFA,确切地说,我想要这样,这样我一次只能更新一个表

标签: php mysql sql


【解决方案1】:

最好重新设计您的数据库,用一张表用于教室,另一张用于班级(每个教室有很多行)等。

但是,如果这不可能,您将需要这样的东西:-

SELECT classroom, id, date, time, classroom_no, students_all, student_current, comments
FROM
(
    SELECT '1' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_1
    UNION
    SELECT '2' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_2
    UNION
    SELECT '3' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_3
    UNION
    SELECT '4' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_4
    UNION
    SELECT '5' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_5
    UNION
    SELECT '6' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_6
    UNION
    SELECT '7' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_7
    UNION
    SELECT '8' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_8
    UNION
    SELECT '9' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_9
    UNION
    SELECT '10' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_10
    UNION
    SELECT '11' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_11
    UNION
    SELECT '12' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_12
    UNION
    SELECT '13' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_13
    UNION
    SELECT '14' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_14
    UNION
    SELECT '15' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_15
) Sub1
INNER JOIN
(
    SELECT classroom, MAX(id) AS maxid
    FROM
    (
        SELECT '1' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_1
        UNION
        SELECT '2' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_2
        UNION
        SELECT '3' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_3
        UNION
        SELECT '4' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_4
        UNION
        SELECT '5' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_5
        UNION
        SELECT '6' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_6
        UNION
        SELECT '7' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_7
        UNION
        SELECT '8' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_8
        UNION
        SELECT '9' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_9
        UNION
        SELECT '10' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_10
        UNION
        SELECT '11' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_11
        UNION
        SELECT '12' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_12
        UNION
        SELECT '13' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_13
        UNION
        SELECT '14' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_14
        UNION
        SELECT '15' AS classroom, id, date, time, classroom_no, students_all, student_current, comments FROM classroom_15
    ) Sub3
    GROUP BY classroom
) Sub2
ON Sub1.classroom = Sub2.classroom AND Sub1.id = Sub2.maxid

请注意,我在 UNION 中添加了一个固定的教室栏。这可能会重复classic_no 的值。

还有一个名为students_all的列。这表明您有一个包含学生列表的列。如果是这样,最好将其拆分到另一个表中,该表可以为每个班级有很多行(班级中的每个学生一个)

【讨论】:

  • 我会试试这个,因为我现在无法更改数据库设计,我希望它能够随时更新任何教室的信息,并且可能随时只更新一个教室,,我会试试这个,但如果有一些更简单的东西也很感激......我的想法是将所有 15 个连接放在一个页面上,这样它将在同一页面上提供 15 个教室,但保留每个教室的最后一条记录课堂数据...但我知道不建议在同一页面中有 15 个连接!或者你怎么看?
  • 没有理由使用多个连接,除非您使用的数据库类会用下一个查询覆盖一个查询。您可以使用单个连接,然后只需传递生成的 $con (如果您在处理第一个表的中途需要访问第二个表,则只需使用不同的变量将mysqli_query(....) 的结果放入)。您可以通过创建基于它的视图来简化上述 SQL 的使用,但这根本不会提高性能(可能会减慢一点)。
  • 好吧,我真的很感谢您的帮助,我不是按照您的建议做的专家,但会尽力在每一行显示一个大页面的教室数据,这就是目的,这一行反映了该表的最新更新(课堂数据)......我确实认为它很复杂,因为我不是那个专家:) 虽然我可以使用 LIMIT 1 显示一个教室的最新更新,这就是成就,现在当来到学校概览,想在一页中显示所有教室数据(仅每张表的最新记录)我觉得很难 cz 我缺乏经验,继续尝试......
  • 我会试着解释一下上面的sql做了什么。它所做的是有许多查询,针对每个房间表,将结果合并在一起。它使用这个结果以及 MAX(id) / GROUP BY 教室。这将获得每个教室的最大 id。然后它再次执行大查询,并将结果与​​每个教室的最大 id 的结果结合起来。这将获取每个教室的每个最大 id 的其他详细信息以将它们输出。您可以将大型查询放入视图中,而视图只允许您像使用表一样使用查询的结果。
  • 非常感谢 Kickstart,非常感谢您的努力,将尽我所能理解并相应地应用。
【解决方案2】:

正如 Kickstart 所建议的:我建议您规范化您的数据库设计。将所有教室数据放入一个带有列的表格中,以显示任何特定行与哪个教室相关。

我不推荐的其他(解决方法)解决方案是create a view。看起来像

CREATE VIEW allData AS
SELECT * from Classroom1
UNION ALL SELECT * from Classroom2
....

然后从此视图中编写选择。

【讨论】:

  • 再次感谢 LIUFA,不幸的是,这超出了我的经验,我无法理解,将尝试其他一些基本的方法,对不起我的英语也很抱歉,我知道我来的时候可能会很烦让你们了解需求:(
  • @MikeDerik 我添加了有关如何创建视图的链接,简而言之,如果您要从多个表中选择相同的数据,您通常会为此创建一个视图。
  • 非常有趣,你给了我大量的功课来学习,谢谢老兄,如果可以的话,会试着理解它并相应地应用,感激:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多