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