我在本地服务器上用phpMyAdmin创建了一个mySQL数据库。在这个数据库中,我存储了我的朋友的名字和最喜欢的NBA球队(以及id作为数据库的主键)。但是,我的一些朋友可能有两个最喜欢的球队。我编写并运行以下php脚本从数据库中的一个表中检索这些数据(我知道这不是让一个表用于多对多关系的最佳方式)并将它们投影到我的本地Web服务器(XAMPP)上:
$dbServername = 'localhost';
$dbUsername = 'root';
$dbPassword = '';
$dbName = 'Friends';
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
header('Content-Type: application/json');
$sql = 'SELECT * FROM friends;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
arr = [];
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$arr[] = $row;
}
}
echo json_encode($arr, JSON_PRETTY_PRINT);
但是,通过这种方式,我将此输出作为一个人使用:
[{
"id": "1",
"name": "David Belton",
"team": "Boston Celtics"
}, {
"id": "1",
"name": "David Belton",
"team": "Cleveland Cavaliers"
}]
但是,我希望得到这样的东西作为每个特定人的输出:
{
"id": "1",
"name": "David Belton",
"team": ["Boston Celtics", "Cleveland Cavaliers"]
}
这可以在PHP中使用吗?
如果是这样,是建议还是应该在数据库中使用MySQL?
答案 0 :(得分:0)
您必须更改while循环,以根据ID列添加到最终数组中的唯一数据:
if ($resultCheck > 0) {
while ($row = mysqli_fetch_assoc($result)) {
if (!isset($arr[$row['id']])) {
$arr[$row['id']] = $row;
$arr[$row['id']]['location'] = [$row['location']];
} else {
$arr[$row['id']]['location'][] = $row['location'];
}
}
}
echo json_encode(array_values($arr), JSON_PRETTY_PRINT);
但你应该考虑@ceejayoz所评论的内容。
答案 1 :(得分:0)
试试这个:
$sql = 'SELECT id, name, GROUP_CONCAT(team) as team FROM friends GROUP BY id;';
$result = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result);
arr = [];
if ($resultCheck > 0) {
$key = 0;
while ($row = mysqli_fetch_assoc($result)) {
$arr[$key] = $row;
$arr[$key]['team'] = explode(",", $row['team']);
$key++;
}
}
echo json_encode($arr, JSON_PRETTY_PRINT);
答案 2 :(得分:0)
这样做的典型方法是拥有users
表和user_favorites
表。将用户特定的项目存储在users
中,user_favorites
类似于user_id: 1, team: Boston Celtics
。
或者(并且最少练习-y),您可以将多个收藏夹存储在单个users
记录中。根据您的数据,您将JSON编码的字符串存储到(Boston Celtics,Cleveland Cavaliers
)中的CSV表示(TEXT
)或["Boston Celtics", "Cleveland Cavaliers"]
字段可以正常工作。
这种方法的缺点是MySQL数据库不易索引,因此当你有很多用户时,SELECT * FROM users WHERE favorite LIKE '%Boston Celtics%'
不会非常快。