PHP   发布时间:2022-04-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php-MySQL查询数据库以显示检查列表的最佳方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我在数据库中有4个表,可以管理一种“检查表”.简而言之,对于每种病理来说,我都有一个很大的步骤(过程),它分为多个任务.所有这些都链接摘要表中的特定操作(progress.case_id).

@H_874_3@database.pathology +--------------+------------+ | id_pathology | name | +--------------+------------+ | 1 | Pathology1 | | 2 | Pathology2 | | 3 | Pathology3 | +--------------+------------+ database.process +------------+----------+--------------+----------------+ | id_process | name | pathology_id | days_allocated | +------------+----------+--------------+----------------+ | 1 | BigTask1 | 2 | 5 | | 2 | BigTask2 | 2 | 3 | | 3 | BigTask3 | 2 | 6 | | ... | ... | ... | ... | +------------+----------+--------------+----------------+ database.task +---------+-------+------------+ | id_task | name | process_id | +---------+-------+------------+ | 1 | Task1 | 1 | | 2 | Task2 | 1 | | 3 | Task3 | 1 | | 4 | Task4 | 2 | | ... | ... | ... | +---------+-------+------------+ database.progress +-------------+---------+---------+---------+------------+---------+ | id_progress | task_id | case_id | user_id | date | current | +-------------+---------+---------+---------+------------+---------+ | 1 | 1 | 120 | 2 | 2015-11-02 | 1 | | 2 | 2 | 120 | 2 | 2015-11-02 | 0 | | 3 | 1 | 121 | 3 | 2015-11-02 | 1 | +-------------+---------+---------+---------+------------+---------+

我必须展示这样的东西

php-MySQL查询数据库以显示检查列表的最佳方法

我的问题是:最有效的方法是什么?

查询一个表(进度)以显示最多表,然后查询一个表以获取差异过程和日期的名称,是否更快?

也许联合功能更有效?

还是您认为我的数据库结构不是更合适?

对于每种情况,我们可以执行大约50个任务,并将当前字段转换为复选框.后台脚本也正在运行.它根据剩余的天数来分析提供的天数,以确定此特定情况是否可能会有延迟.

对于每种情况,进度表已经充满了与病例病理相关的所有任务.开始时,当前字段始终为“ 0”.

我已经尝试过多种方法,例如

@H_874_3@$result = $db->prepare("SELECT DISTinCT process_id,process.name FROM task, progress,process WHERE progress.task_id = task.id_task AND task.process_id = process.id_process AND progress.case_id = ?"); $result->execute(array($id)); foreach($result as $row) { echo "<b>".$row[1]."</b><br>"; $result = $db->prepare("SELECT name,id_task FROM task WHERE process_id = ?"); $result->execute(array($row[0])); foreach($result as $row) { echo $row[0]; $result = $db->prepare("select user_id, date, current FROM progress WHERE progress.task_id = ? AND case_id = ?"); $result->execute(array($row[1], $id)); foreach($result as $row) { if($row[2] == 0) {echo "<input type='checkBox' />";} else { echo "<input type='checkBox' checked/>"; echo "user : ".$row[0]." date : ".$row[1]."<br>"; } } }

但是我很确定我做错了.我应该更改数据库基础结构吗?@R_25_10675@用特定的Mysql技巧吗?还是只是更高效的PHP处理?

解决方法:

在效率方面,数据库查询是您可以执行的最慢的操作之一.您可以采取任何减少您查询数量方法来加快应用程序的速度.

但更重要的是,您的应用程序需要按设计工作,这意味着开发人员需要了解正在发生的事情,数据不应该只是为了被覆盖而徘徊,而初级开发人员将负责维护此功能.在3年内不会想把头发扯掉.

快总比慢好.

慢胜于断.

对于您的特定问题,如果可能,永远不要在循环内进行查询.特别是当该循环由您从同一数据库提取的数据控制时.这是一种代码气味,要求正确使用JOIN.

Google Image搜索SQL Join Diagrams显示大量的维图示例,这些维显示了每个JOIN返回的不同类型的数据.如有疑问,通常需要左联接.

因此,让我们确定您的关系:

>病理学

>未在结果中使用.
>找到一种将其合并到查询中的方法,因为“ Pathology2”出现在您的模型中.

>流程

>以一对多关系引用病理学.每个进程可以具有一个病理,但是每个病理可以具有0个或多个进程.

>任务

>一对多关系中的参任务.任务包含Process的子级.

>进展

>参任务,以及未显示的案例和用户.当引用特定案例和用户时,进度似乎是任务的详细信息.
>我假设存在一个业务约束,其中task_id,case_id和user_id必须是唯一的…也就是说,用户1只能为任务1和案例100提供1个Progress条目.
>除了保存任务的详细信息外,还充当任务,案例和用户间的桥梁,为这三个表提供多对多关系.由于Task是Process的直接子代,而Process是Pathology的直接子代,因此它与Pathology具有多对多的关系.

>案例

>推断该表的存在.
>由任务引用.

>用户

>推断该表的存在.
>由任务引用.

根据此表结构,我们的主要分组将是案例,病理和用户.

也就是说,如果您是登录用户,并且想要按Case查看进度,则需要查看以下内容

@H_874_3@Case 110: Pathology1: BigTask1: Task1: X Task2: [] BigTask2: Task3: X Pathology2: BigTask3: Task4: [] Case 120: Pathology1: BigTask1: Task1: []

我们希望用户ID == 1;
我们的第一个排序将基于Case
我们的第二种分类将基于病理学
我们的第三种排序将基于过程
我们最后的排序将在Task上进行…

因此,获得上述结果的数据将是:

@H_874_3@+------+------------+----------+-------+----------+ | case | pathology | process | task | progress | +------+------------+----------+-------+----------+ | 110 | Pathology1 | BigTask1 | Task1 | 1 | | 110 | Pathology1 | BigTask1 | Task2 | 0 | | 110 | Pathology1 | BigTask2 | Task3 | 1 | | 110 | Pathology2 | BigTask3 | Task4 | 0 | | 120 | Pathology1 | BigTask1 | Task1 | 0 | +------+------------+----------+-------+----------+

我们的’ORDER BY’子句从头到尾… ORDER BY任务,过程,病理学,案例…我们可以用PHP对其进行排序,但是数据库比我们要好.如果您的索引设置正确,则数据库甚至不必对事物进行排序,它只会按顺序获取它.

特定用户获取上述数据的查询为:

@H_874_3@SELECT prog.case_id AS case, path.name AS pathology, proc.name AS process, task.name AS task, prog.current AS progress FROM pathology path LEFT JOIN process proc ON path.id_pathology = proc.pathology_id LEFT JOIN task ON task.process_id = proc.id_process LEFT JOIN progress prog ON task.id_task = prog.task_id WHERE prog.user_id = :userid ORDER BY task, process, pathology, case

然后,您的PHP可能遵循

@H_874_3@<?PHP $sql = <<<EOsql SELECT prog.case_id AS case, path.name AS pathology, proc.name AS process, task.name AS task, prog.current AS progress FROM pathology path LEFT JOIN process proc ON path.id_pathology = proc.pathology_id LEFT JOIN task ON task.process_id = proc.id_process LEFT JOIN progress prog ON task.id_task = prog.task_id WHERE prog.user_id = :userid ORDER BY task, process, pathology, case EOsql; $result = $db->prepare($sql); $result->execute(array(':userid' => $id)); $rows = $result->fetchAll(PDO::FETCH_ASSOC); foreach ($rows as $row) { var_dump($row); // array(5) { // ["case"]=> // int(110) // ["pathology"]=> // String(10) "Pathology1" // ["process"]=> // String(8) "BigTask1" // ["task"]=> // String(5) "Task1" // ["progress"]=> // int(1) // } }

大佬总结

以上是大佬教程为你收集整理的php-MySQL查询数据库以显示检查列表的最佳方法全部内容,希望文章能够帮你解决php-MySQL查询数据库以显示检查列表的最佳方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: