Mysql将连接表作为子数组

时间:2016-06-13 16:27:05

标签: php mysql

我正在使用myqli查询作为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 OUTPUT:

enter image description here

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

有什么想法吗?

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

1 个答案:

答案 0 :(得分:0)

您需要为此任务进行所谓的急切加载。它将涉及两个查询,但它会比一个更好。

您必须先选择您的人员,然后获取人员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;
}