Я создал базу данных mySQL с помощью phpMyAdmin на моем локальном сервере. В этой базе данных я сохранил имена и любимые команды моих друзей НБА (вместе с идентификатором в качестве первичного ключа для базы данных). Однако у некоторых из моих друзей могут быть две любимые команды. Я написал и запустил следующий php-скрипт, чтобы получить эти данные из одной таблицы в базе данных (Я знаю, что это не лучший способ иметь одну таблицу для отношений "многие ко многим".) и спроецировать их на мой локальный веб-сервер (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 обратно в базу данных?
Если вы должен храните его в одной таблице (вы не должны), сохраните разделенный запятыми или закодированный в JSON текст нескольких избранных в одной пользовательской записи.
Спасибо @ceejayoz за ваш комментарий. Да, я понимаю, что вы имеете в виду, говоря о внешнем ключе. Однако вы можете написать об этом подробно, если хотите.
Нет, я не должен этого делать, но мне просто интересно, как это сделать быстро, избегая внешних ключей или объединения таблиц и т. д.
Как это выглядит в MySQL? Я считаю, что вам следует сначала нормализовать таблицу st.
@Poete_Maudit Сделать это через JOIN быстро, легко, и вам определенно стоит освоиться.
Хорошо @ceejayoz. Я уважаю это. У вас есть четкая ссылка, объясняющая, как это сделать?
@Poete_Maudit stackoverflow.com/questions/14902888/…
Хорошо спасибо. Могу я спросить здесь кое-что краткое ?: Зачем нужны две таблицы? Обычно отношения «многие ко многим» используют три стрелки для двух типов вещей.
Да, если у вас есть таблица teams, вам понадобится user_teams («сводная таблица») или что-то такое, что представляет собой всего лишь пару идентификаторов. Поскольку в настоящее время вы храните их в виде строк в таблице пользователей, я предложил подход с двумя таблицами.
Хорошо, спасибо за помощь. Если вы хотите увидеть более подробно, что я сделал с MySQL, посмотрите здесь: stackoverflow.com/questions/49279952/….






Вы должны изменить цикл 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.
Попробуй это:
$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);
Типичный способ сделать это - иметь таблицу users и таблицу user_favorites. Храните пользовательские элементы в users, и user_favorites будет чем-то вроде user_id: 1, team: Boston Celtics.
В качестве альтернативы (и менее оптимальной) вы можете сохранить несколько избранных в одной записи users. В зависимости от ваших данных, будет работать представление CSV (Boston Celtics,Cleveland Cavaliers) или, возможно, поле TEXT, в котором вы храните строку в кодировке JSON (["Boston Celtics", "Cleveland Cavaliers"]).
Обратной стороной этого подхода является то, что он труднее индексируется базой данных MySQL, поэтому SELECT * FROM users WHERE favorite LIKE '%Boston Celtics%' не будет очень быстрым при большом количестве пользователей.
нет .. должно быть 3 таблицы: users, teams, users_favorite_teams .. столбцы более поздней таблицы - только user_id, team_id
@MateiMihai В целом я согласен, но не ясно, что OP имеет / нуждается в таблице teams вообще. Это могут быть какие-то данные профиля с произвольным текстом.
Я бы предложил другую структуру базы данных. Одна таблица для пользователей, одна таблица для их избранного (связанная внешним ключом идентификатора пользователя).