php - Mysql 将连接表作为子数组返回

标签 php mysql

我使用 mysqli 查询作为 JSON 输出。

这是我的查询:

    $sql = "SELECT p.*,comments.*,COUNT(comments.id) AS numComments FROM people AS p
LEFT JOIN comments ON comments.people_id = p.id
 WHERE p.name LIKE '%".$data."%'";
$result = $conn->query($sql);

if ($result->num_rows > 0) {
    // output data of each row
    while($row = $result->fetch_assoc()) {
        $myArray[] = $row;
    }
    echo json_encode($myArray);
} else {
    echo 0;
}

我想要做的是将所有人员评论分组并将其放置在人员数据下。例如:

期望的输出是我将能够不直接从查询访问评论,而是从人本身访问评论。

例如: echo $person['comment'][0]['content']

目前,我像访问任何查询数据一样访问它..

echo $person['content']

JSON 输出:

enter image description here

如您所见,人物数据和评论数据混合在同一个数组中。我希望评论有自己的数组。

有什么想法吗?

编辑: 看来我的查询有问题。它只返回第一条评论!

最佳答案

您需要所谓的“预先加载”来完成此任务。它将涉及两个查询,但比一个要好得多。

您必须首先选择您的人员,然后获取人员 ID 并查询评论表以获取评论。最后你必须将两个数组组合在一起。

我将使用 PDO,因为它需要编写的代码减少 5 倍,thanks to some neat PDO features .

$stmt = $conn->prepare("SELECT * FROM people WHERE name LIKE ?");
$stmt->execute(["%$data%"]);
$people = $stmt->fetchAll(PDO::FETCH_UNIQUE);

$ids  = array_keys($people);
$in   = str_repeat('?,', count($ids) - 1) . '?';
$stmt = $db->prepare("SELECT people_id, * FROM comments WHERE people_id IN ($in)");
$stmt->execute($ids);
$comments = $stmt->fetchAll(PDO::FETCH_GROUP);

foreach($people as $id=>$row)
{
    $row['comments'] = $comments[$id];
    $people[$id] = $row;
}

关于php - Mysql 将连接表作为子数组返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37794790/

相关文章:

php - 带有条件小节的多页 AJAX 表单

mysql - 我只想显示 MySQL 数据库中从今天到 future 30 天的日期

mysql - 删除 mysql joomla 数据库中表中列中的千点

php - 将 mySQL 查询作为 cron 作业运行?

MySql 偏移量查询不起作用

PHPExcel 无法正常工作

php - Composer .lock : how does it work?

mysql - 简单 InnoDB 表上的简单 MySQL INSERT 查询需要 40+ms

php - Symfony2 表单为什么我的表单返回警告 : json_encode(): recursion detected?

php - 使用表达式或 jQuery 更改 Laravel Blade 中的 div 宽度