Множественная таблица MySQL для json_encode

У меня есть 3 разных таблицы в моей базе данных под названием consoleConsole , consoleModel и consoleGame . Тогда то, что я хочу сделать, это то, что каждая консоль будет иметь петлю внутри своих моделей, и у каждой модели будет еще один цикл внутри для таких игр:

[
   {
      "Console":"PlayStation",
      "Information":[
         {
            "Model":"PlayStation 3",
            "Title":[
               {
                  "Game":"007 Legends",
                  "Publisher":"Electronic Arts"
               },
               {
                  "Game":"Ace Combat: Assault Horizon",
                  "Publisher":"Namco"
               }
            ]
         },
         {
            "Model":"PlayStation 2",
            "Title":[
               {
                  "Game":"007: Agent of Fire",
                  "Publisher":"Electronic Arts"
               },
               {
                  "Game":"Ace Combat 4: Shattered Skies",
                  "Publisher":"Namco"
               }
            ]
         },
         {
            "Model":"PlayStation 1",
            "Title":[
               {
                  "Game":"007 Racing",
                  "Publisher":"Electronic Arts"
               },
               {
                  "Game":"Ace Combat",
                  "Publisher":"Namco"
               }
            ]
         }
      ]
   },
   {
      "Console":"Wii",
      "Information":[
         {
            "Model":"Wii",
            "Title":[
               {
                  "Game":"007: Quantum of Solace",
                  "Publisher":"Activision"
               },
               {
                  "Game":"AC/DC Live: Rock Band Track Rack",
                  "Publisher":"MTV Games"
               }
            ]
         }
      ]
   },
   {
      "Console":"Xbox",
      "Information":[
         {
            "Model":"Xbox",
            "Title":[
               {
                  "Game":"AFL",
                  "Publisher":"Acclaim"
               },
               {
                  "Game":"American Chopper",
                  "Publisher":"Activision"
               }
            ]
         },
         {
            "Model":"Xbox 360",
            "Title":[
               {
                  "Game":"AFL Live",
                  "Publisher":"Electronic Arts"
               },
               {
                  "Game":"Akai Katana Shin",
                  "Publisher":"Cave"
               }
            ]
         }
      ]
   }
]

Но, к сожалению, я не использовал свою базу данных с этим, но вместо этого я просто написал ее прямо в php-файле.

<Сильный> ИЗМЕНИТЬ

В любом случае, двигайтесь дальше. Я изменил свой код и закончил так.

<?php
    $consoleQuery = "SELECT * ".
    "FROM consoleConsole ".
        "JOIN consoleModel ".
                "ON consoleConsole.consoleId = consoleModel.consoleId ".
            "JOIN consoleGame ".
                "ON consoleModel.modelId = consoleGame.gameId";

$consoleResult = mysql_query($consoleQuery);

$consoleFields = array_fill_keys(array(
    'consoleName',
    ), null);

$modelFields = array_fill_keys(array(
    'modelName',
    ), null);

$console = array();
$rowConsole = array();

while ($rowConsole = mysql_fetch_assoc($consoleResult)) {
    $consoleId = $rowConsole['consoleId'];
    $modelId = $row['modelId'];
    if (isset($console[$consoleId]['Information'])) {
        $console[$consoleId]['Information'][] = array_intersect_key($rowConsole, $modelFields);
    }

    else {
        $console[$consoleId] = array_intersect_key($rowConsole, $consoleFields);
        $console[$consoleId]['Information'] = array(array_intersect_key($rowConsole, $modelFields));
    }
}

$console = array_values($console);
echo json_encode($console);

?>

Я смог произвести выход, но он не выглядит выше.

[
  {
    "consoleName": "PlayStation",
    "Information": [
      {
        "modelName": "PlayStation"
      },
      {
        "modelName": "PlayStation 2"
      },
      {
        "modelName": "PlayStation 3"
      },
      {
        "modelName": "PlayStation 3"
      }
    ]
  },
  {
    "consoleName": "Wii",
    "Information": [
      {
        "modelName": "Wii"
      },
      {
        "modelName": "Wii"
      }
    ]
  },
  {
    "consoleName": "Xbox",
    "Information": [
      {
        "modelName": "Xbox"
      },
      {
        "modelName": "Xbox 360"
      }
    ]
  }
]

Their relations: enter image description here

Какая у меня проблема сейчас, я не могу добавить заголовок каждой игры.

5
nl ja de
sql возвращает «плоскую» таблицу, если вам нужна более сложная структура данных, вам нужно ее самостоятельно построить
добавлено автор Itai Sagi, источник
Да, я понял, что это трудно :(
добавлено автор Jahm, источник

2 ответы

Хорошо, поэтому я написал ваше решение. Вы должны быть уверены, что заказ включен, потому что он предполагает, что вы заказываете их вместе с ними. Я также не знал, как был сохранен ваш издатель, поэтому я разделил его на отдельную таблицу (это позволит вам затем получать предметы от издателя), а теперь 4 объединения. Также в другой заметке я обновил ее, чтобы сделать внутренние соединения. Таким образом, вы не получите пустых результатов для консолей, у которых нет назначенных им игр. Если вы захотите, вы можете просто сменить соединения, чтобы они дали вам эти результаты. Позвольте мне знать, если это помогает

//get all of the information
$query = '
    SELECT c.consoleId,c.consoleName,m.modelId,m.modelName,g.gameId,g.gameName,p.publisherId,p.publisherName
    FROM `consoleconsole` c
        INNER JOIN `consolemodel` m ON c.consoleId=m.consoleId
        INNER JOIN `consolegame` g ON m.modelId=g.modelId
        INNER JOIN `consolepublisher` p ON g.publisherId = p.publisherId
    ORDER BY c.consoleName, m.modelName, g.gameName
';

//get the results
$result = mysql_query($query);

//setup array to hold information
$consoles = array();

//setup holders for the different types so that we can filter out the data
$consoleId = 0;
$modelId = 0;

//setup to hold our current index
$consoleIndex = -1;
$modelIndex = -1;

//go through the rows
while($row = mysql_fetch_assoc($result)){
    if($consoleId != $row['consoleId']){
        $consoleIndex++;
        $modelIndex = -1;
        $consoleId = $row['consoleId'];

        //add the console
        $consoles[$consoleIndex]['console'] = $row['consoleName'];

        //setup the information array
        $consoles[$consoleIndex]['information'] = array();
    }

    if($modelId != $row['modelId']){
        $modelIndex++;
        $modelId = $row['modelId'];

        //add the model to the console
        $consoles[$consoleIndex]['information'][$modelIndex]['model'] = $row['modelName'];

        //setup the title array
        $consoles[$consoleIndex]['information'][$modelIndex]['title'] = array();
    }

    //add the game to the current console and model
    $consoles[$consoleIndex]['information'][$modelIndex]['title'][] = array(
        'game'      => $row['gameName'],
        'publisher' => $row['publisherName']
    );
}

echo json_encode($consoles);
3
добавлено
while ($ row = mysql_fetch_assoc ($ result)) дает Предупреждение: mysql_fetch_assoc() ожидает, что параметр 1 будет ресурсом, boolean given . Кстати, в INNER JOIN в $ query , не он ли consoleModel и т. Д.?
добавлено автор Jahm, источник
Спасибо огромное!
добавлено автор Jahm, источник
Ну, есть немного уловка. Я добавил PlayStation Portable в consoleModel с modelId = 8 и consoleId = 1 . Проблема в том, что он не отображается в списке. Я также добавил SNES в consoleModel с consoleId = 5 .
добавлено автор Jahm, источник
Ahh, я понял это сейчас. Он не показывает добавленную консоль или модель, если в ней нет игры.
добавлено автор Jahm, источник
вы можете мне помочь?
добавлено автор Jahm, источник
хорошо, вы должны всегда выполнять некоторую проверку ошибок, прежде чем пытаться извлечь строки. Но в основном это означает, что в этом случае ваш запрос не работает. Удостоверили ли вы, что запрос выстроился в очередь с вашими таблицами? Я создал эту дополнительную таблицу там «consolePublishers», и если у вас ее нет, значит, она не сработает. Вам нужно будет создать эту таблицу или изменить запрос, чтобы предоставить необходимую вам информацию. Вы можете изменить строку запроса на «mysql_query ($ query) или die (mysql_error ())», если вы хотите увидеть, что такое фактическая ошибка.
добавлено автор ngreenwood6, источник
Да, это consoleModel и т. Д., Но поскольку MySQL нечувствителен к регистру (в большинстве случаев), это не имеет большого значения, но вы должны обновить его, чтобы он соответствовал вашей структуре таблицы.
добавлено автор ngreenwood6, источник
Совершенно никаких проблем. Надеюсь, он хорошо работает для вас!
добавлено автор ngreenwood6, источник
Да, код, который я вам предоставил, не даст вам результатов, если у вас нет игр внутри моделей. Однако, если вы измените «INNER JOIN» на «LEFT JOIN», тогда он даст вам консоли/модели, даже если у них нет игр. Все зависит от того, чего вы пытаетесь достичь.
добавлено автор ngreenwood6, источник

Поскольку вы используете функцию PHP для кодирования json, это даст вам json в формате по умолчанию. вам нужно создать свою собственную функцию, используя строковые манипуляции, чтобы получить желаемый результат.

3
добавлено
Я верю результат обработки строк внутри json_encode вправо или нет?
добавлено автор Jahm, источник
Но будет ли выход еще JSON?
добавлено автор Jahm, источник
нет, вам не нужен json_encode где-нибудь только для циклов и некоторых конкатенаций строк.
добавлено автор Dharmendra, источник
json nothign, но формат данных, имеющих отношения родитель-ребенок, и может иметь несколько уровней этих отношений. И если вы можете получить эту структуру через PHP или naything и сохранить ваш файл как расширение .json, тогда вы получите себе json-файл.
добавлено автор Dharmendra, источник
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp