Попытка объединить два результата запросов SQL - Приложение ToDoList - PullRequest
0 голосов
/ 24 февраля 2020

Я пытаюсь объединить два результата двух запросов в MYSQL, используя PHP, но я озадачен, как это сделать! Я использую PDO. Я программирую для хобби и пытаюсь составить список дел, как на доске Trello. Однако я просто не могу понять, как объединить два результата из разных таблиц в базе данных.

Идея заключается в следующем:

У меня есть таблица с именем 'task_lists' с содержимым :

'list_id => 1, list_name = 'listOne'
'list_id => 2, list_name = 'listTwo'

И таблица с именем 'tasks':

task_id => 1, list_id => 1, task_name => 'taskOfListOne', duration => 5, is_done => 1
task_id => 2, list_id => 1, task_name => 'anotherTaskOfListOne', duration => 5, is_done => 1
task_id => 3, list_id => 2, task_name => 'taskOfListTwo', duration => 10, is_done => 0

И я пытаюсь создать массив, который объединяется между двумя результатами как что-то вроде: (Я знаю это это грубая картина того, как должен выглядеть массив)

$result = [array]
[list_id] = 1, [list_name] = 'listOne' => 
                     [array][list_id] = 1, ['task_name] = taskOfListOne,[duration] = 5, ['is_done'] => 1
                     [array][list_id] = 1, ['task_name] = anotherTaskOfListOne,[duration] = 5, ['is_done'] => 1
[list_id] = 2, [list_name] = 'listTwo' =>
                     [array][list_id] = 2, ['task_name] = taskOfListTwo,[duration] = 5, ['is_done'] => 1


Возможно ли это вообще? Я пробовал запрос и методы Union sql, такие как вложенные операторы foreach, но ни один из них не помог мне. Я что-то здесь упускаю?

PS: Извините за мой плохой английский sh.

1 Ответ

3 голосов
/ 24 февраля 2020

Вы пробовали левое соединение?

SELECT TL.`list_id`, TL.`list_name`, T.`task_name`, T.`duration`  
FROM task_lists AS TL
LEFT JOIN tasks as T ON TL.`list_id` = T.`list_id`

А затем в PHP вы строите массив в нужном формате.

Позже редактирование: Простой PHP пример для анализа SQL данных по вашему запросу (для удаления дублирующейся информации):

<?php
// $mysql_rows -> here is your query result, fetched as associative array
$filtered_array = array();
foreach ($mysql_rows as $row){

    // Initiate record if is not already initiated
    if (!isset($filtered_array[ $row['list_id'] ])){
        $filtered_array[ $row['list_id'] ] = array(
            'list_id'   => $row['list_id'],
            'list_name' => $row['list_name'],
            'tasks'     => array()
        );
    }

    // Add tasks
    $filtered_array[ $row['list_id'] ]['tasks'][] = array(
        'task_name'  => $row['task_name'],
        'duration'   => $row['duration'],
        'is_done '   => $row['is_done ']
    );
}

// Optional: if you want to remove list_id from $filtered_array key names, uncomment the next line
// $filtered_array = array_values($filtered_array);
?>
...