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]);
реляционной БД не возвращают вложенные таблицы .. но связь между столом .. (псевдоним выберите со строками, состоящих столбцами выбранных) .. если вам это нужно второй (реляционный) способ, которым вы можете это сделать со вступлением. – scaisEdge