У меня есть 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 |
+-------------+---------+---------+---------+------------+---------+
Я должен показать что-то вроде этого
Мой вопрос: что является наиболее эффективным способом, чтобы продолжить?
Является ли быстрее запрашивать только одну таблицу (прогресс), чтобы отображать наиболее и только затем запрашивать другую, чтобы получить имена разного процесса и дней?
Возможно, совместная функция более эффективна?
Или вы считаете, что моя структура базы данных более не подходит?
Для каждого случая мы можем иметь aproximaly 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, вы должны распознавать вложенные запросы как анти-шаблон разработки программного обеспечения. Вы все время пытаетесь найти альтернативный способ решить проблему, когда увидите этот анти-шаблон. Это не значит, что всегда будет лучший подход, но, как уже отмечалось, вы почти всегда найдете, что это так. –
В MySQL рассмотрим тип данных 'SET'. –