我在数据库中有4个表格,允许我管理一种“检查列表”。在每个pathology
几句话,我有一大步(process
)分裂成tasks
的倍数。所有这些都与汇总表中的特定操作(progress.case_id
)相关联。MySQL查询数据库以显示检查列表的最佳方式
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处理?
嵌套查询线路查询几乎总是可以更好地写成单个“连接”查询。 –
要添加到@MarcB的评论中,YOu应该将嵌套查询识别为软件开发反模式。当你看到这种反模式时,你总是寻找另一种解决问题的方法。这并不是说总会有更好的方法,但正如所指出的那样,你几乎总是会发现这种情况。 –
在MySQL中,考虑'SET'数据类型。 –