#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']); }
Комментариев нет:
Отправить комментарий