大佬教程收集整理的这篇文章主要介绍了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 |
+-------------+---------+---------+---------+------------+---------+
我必须展示这样的东西
我的问题是:最有效的方法是什么?
仅查询一个表(进度)以显示最多表,然后查询另一个表以获取差异过程和日期的名称,是否更快?
也许联合功能更有效?
还是您认为我的数据库结构不是更合适?
对于每种情况,我们可以执行大约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,请注明来意。