2017-01-28 2 views
0

как решить на практике nested responds to comments? У меня есть таблица со столбцами:SQL-подзапрос возвращает больше строк с большим количеством столбцов

  • comment_id (INT, первичный ключ комментария)
  • автор (VARCHAR, имя отправителя)
  • содержание (текст, содержание сообщения)
  • book_id (INT, внешний ключ другой таблицы)
  • response_to (INT, может быть NULL, внешний ключ к таблице)

и я должен был бы такой массив из SQL запрос:

$result = [ 
    [ // First comment 
    'author' => 'Michael', 
    'content' => 'It's very good book!', 
    'responds' => [ 
     ['author' => 'Martin', 'content' => 'I agree.'], 
     ['author' => 'Susan', 'content' => 'Hello world!.'] 
    ] 
    ], 
    [ // Another comment 
    'author' => 'Tomas', 
    'content' => 'Hi everyone!', 
    'responds' => [ 
     ['author' => 'Jane', 'content' => 'Hi.'] 
    ] 
    ], 
    ... 
]; 

Первое решение (очень ineficient)

// Get all the comments of this book. 
$comments = $db->query('SELECT * FROM comments WHERE book_id = ? AND response_to IS NULL', [$bookId]); 

// Find all the responds to each comments. 
foreach ($comments as &$comment) { 
    $comment['responds'] = $db->query('SELECT * FROM comments WHERE response_to = ?', [$comment['comment_id']]); 
} 

Второе решение (не работает)

$db->query('SELECT t1.*, 
    (SELECT * FROM comments AS t2 WHERE t2.response_to = t1.comment_id) AS responds 
    FROM comments AS t1 WHERE t1.book_id = ?', [$bookId]); 
+0

реляционной БД не возвращают вложенные таблицы .. но связь между столом .. (псевдоним выберите со строками, состоящих столбцами выбранных) .. если вам это нужно второй (реляционный) способ, которым вы можете это сделать со вступлением. – scaisEdge

ответ

0

Ошибка происходит потому, что можно выбрать только один столбец и не более одной строки с использованием описанного выше метода.

Вы можете использовать левое автообъединение вместо

select * 
from comments t1 
left join comments t2 
on t1.comment_id = t2.response_to 
where t1.book_id = ? 
Смежные вопросы