我正在使用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:
如您所见,人员数据和评论数据混合在同一个数组中。我希望评论有自己的数组。
有什么想法吗?
编辑:好像我的查询有问题。它只返回第一条评论!
答案 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;
}