【发布时间】:2015-11-02 15:39:37
【问题描述】:
我在数据库中有 4 个表,允许我管理一种“检查表”。简而言之,对于每个 pathology,我有一大步 (process) 拆分为 tasks 的倍数。所有这些都与汇总表中的特定操作 (progress.case_id) 相关联。
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'。
我已经尝试了多种方法,例如
$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>";
}
}
}
但我很确定我做得不对。我应该改变我的数据库基础设施吗?我应该使用特定的 MySQL 技巧吗?或者也许只是更高效的 PHP 处理?
【问题讨论】:
-
嵌套查询,其中内部查询使用来自外部查询的数据,几乎总是可以更好地编写为单个
joined 查询。 -
要从@MarcB 添加到 cmets,您应该将嵌套查询识别为软件开发反模式。当您看到这种反模式时,您应该始终寻找解决问题的替代方法。这并不是说总会有更好的方法,但如前所述,您几乎总会发现这种情况。
-
在 MySQL 中,考虑
SET数据类型。
标签: php mysql database performance