2017-05-31 22 views
1

タスクテーブルから親データを選択し、子SubTaskテーブルを左結合し、子データをタスク配列の配列に追加するmysqlクエリを記述する必要がありますMySQL結合されたテーブルを結果の配列として選択する

:そう...ここ

タスク

id| details  | created 
=============================== 
1 | This is.... | 2017-08-19 
2 | This is.... | 2017-08-20 
3 | This is.... | 2017-08-21 

サブタスク

id | task_id | details  | created 
============================================ 
123 | 1  | This is.... | 2017-08-19 
234 | 1  | This is.... | 2017-08-20 
345 | 2  | This is.... | 2017-08-21 
456 | 2  | This is.... | 2017-08-21 
567 | 3  | This is.... | 2017-08-21 


[ 
     [ 
      'id'=>1, 
      'details'=>'This is from the task table', 
      'subTasks'=>[ 
       [ 
        'id'=>123, 
        'details'=>'This is from the sub task table', 
       ], 
       [ 
        'id'=>234, 
        'details'=>'This is from the sub task table', 
       ] 
      ] 
     ], 
     [ 
      'id'=>2, 
      'details'=>'This is from the task table', 
      'subTasks'=>[ 
       [ 
        'id'=>345, 
        'details'=>'This is from the sub task table', 
       ], 
       [ 
        'id'=>456, 
        'details'=>'This is from the sub task table', 
       ] 
      ] 
     ] 
     [ 
      'id'=>3, 
      'details'=>'This is from the task table', 
      'subTasks'=>[ 
       [ 
        'id'=>567, 
        'details'=>'This is from the sub task table', 
       ] 
      ] 
     ] 
    ] 

は私のクエリであるように

$sql = " SELECT t.*, 
         (select st.* from SubTask) as SubTasks 
      FROM  Task t 
      LEFT JOIN SubTask st 
       ON  st.task_id = t.id 
      "; 

私はこのクエリが正しくないことを知っていますが、私はそうでなければそれを書く方法はわかりません。

+0

テーブル構造 –

+0

を表示すると、いくつかの情報でテーブルを表示しなくても大変助かります。 – jjoselon

+0

最も基本的なテーブルの詳細が追加されました – LargeTuna

答えて

2

あなたはただ、selectサブクエリを必要としません:

SELECT t.id AS task_id, t.details AS task_details, st.id AS subtask_id, st.details AS subtask_details 
FROM Task t 
LEFT JOIN SubTask st ON st.task_id = t.id 

次に、あなたのPHPコードは配列にすべてのサブタスクの情報を収集することができます。

$tasks = []; 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    $task_id = $row['task_id']; 
    if (!isset($tasks[$task_id])) { 
     $tasks[$task_id] = ['id' => $task_id, 'details' => $row['task_details'], 'subtasks' => []]; 
    } 
    if ($row['subtask_id'] !== null) { 
     $tasks[$task_id]['subtasks'][] = ['id' => $row['subtask_id'], 'details' => $row['subtask_details']]; 
    } 
} 
+0

これは素晴らしい仕事でした! – LargeTuna

関連する問題