Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Преобразование двухтабличного запроса MySQL в ассоциативный массив PHP

#mysql #массивы #pdo


Здравсвуйте!

Ситуация: есть база данных теста в MySQL с таблицами:
 - вопрос(столбцы - ID, QUESTION),
 - ответ(столбцы - ID, ANSWER, QUESTION_ID),
 - результат(столбцы - ID, USER, RESULT).

К каждому вопросу есть 4 варианта ответа(маркированы по QUESTION_ID).

Собственно - как создать запрос к базе данных, что-бы в результате получать асоциативный
массив вида: вопрос->варианты ответа. 

Пока смог наваять код который выводит количество вопросов аналогичное количеству
вариантов ответов. Ниже представлен код. В нем закоментирован изначальный рабочий асоциативный
масив. Хотелось бы такой же получить посредством PDO и MYSQL запроса. Заранее большое
спасибо за помощь!

$db = new PDO('mysql:host=localhost; dbname=matrix', 'root', '');
$sql = 'SELECT `question`, `answer` FROM `questions` INNER JOIN  `answers` WHERE
questions.id = answers.question_id;';
$res = $db->query($sql);
$test = $res->FETCHALL(PDO::FETCH_ASSOC);

//        $test = [
//            'Who are you?' => ["Men", "Women", "Choosen_one", "Mutant"],
//            'What is you name?' => ["Neo", "Morpheus", "Trinity", "Tank"],
//            'How old are you?' => ['10', '25', '40', '60'],
//            'Follow the white rabbit?' => ['Yes', 'No', 'Dont_know', 'Maybe'],
//            'What is you favorite food?' => ['Sweets', 'Cakes', 'Meat', 'Vegetables']
//        ];

$questions = array_keys($test);
shuffle($questions);
foreach ($questions as $value) {
    $answers = $test[$value];
    shuffle($answers);
    echo "{$value}
"; foreach ($answers as $value2) { echo ""; echo "{$value2}
"; } }


Ответы

Ответ 1



PDO умеет строить массив с указанной вами структурой. Надо только указать это ключами PDO::fetchall. Сам SQL запрос модифицировать не нужно: $sql = 'SELECT `question`, `answer` FROM `questions` INNER JOIN `answers` WHERE questions.id = answers.question_id;'; $res = $db->query($sql); $test = $res->FETCHALL(PDO::FETCH_COLUMN|PDO::FETCH_GROUP); print_r($test); В таком режиме fetchall сгруппирует значения как раз по первому столбцу выборки. Если надо группировать по какому нибудь другому столбцу, то его номер (начиная с 0) надо передать вторым параметром.

Ответ 2



Вы можете воспользоваться следующим запросом SELECT questions.question AS question, GROUP_CONCAT(answers.answer) AS answer FROM questions LEFT JOIN answers WHERE questions.id = answers.question_id GROUP BY questiron.id GROUP_CONCAT() вернет строку, в которой ответы будут разделены запятой, преобразовать эту в строку можно при помощи функции explode(). $test = []; while($question = $res->fetch(PDO::FETCH_ASSOC) { $test[$question['question']] = explode(',', $question['answer']); }

Комментариев нет:

Отправить комментарий