Каким образов в mysql реализовать выборку вопросов отвеченных правильно?

Есть две таблицы, таблица ответов на вопросы, и таблица ответов пользователей на данные вопросы.
Как выбрать все вопросы на которых пользователь ответил правильно, с учетом того что у одного вопроса может быть несколько правильных ответов.
Таблицу вопросов не стал приводить, так как в контексте задачи она не нужна, связь с ней идет по question_id
CREATE TABLE `cms_testing_answer` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  `question_id` int(11) NOT NULL DEFAULT '0' COMMENT 'Вопрос',
  `status` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT 'Статус',
  `sort` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Сортировка',
  `title` text NOT NULL COMMENT 'Заголовок',
  `mark` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT 'Оценка',
  `is_correct` smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT 'Флаг правильного ответа',
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=1169 DEFAULT CHARSET=utf8;

CREATE TABLE `cms_testing_user_answer` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Идентификатор',
  `session_id` int(11) NOT NULL DEFAULT 'Идентификатор сессии тестирования',
  `question_id` int(11) NOT NULL DEFAULT 'Идентификатор вопроса',
  `user_id` int(11) unsigned NOT NULL DEFAULT 'Идентификатор пользователя',
  `test_id` int(11) NOT NULL DEFAULT 'Идентификатор тестирования',
  `answer_id` int(11) NOT NULL DEFAULT 'Идентификатор ответа',
  `created_at` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'Дата создания',
  PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=133 DEFAULT CHARSET=utf8;

Пример правильный/ не правильный ответ из таблицы
Ответы на вопрос
cms_testing_answer
id | question_id | ___title___ | is_correct
1 ______1___________ Ответ 1_______1
2 ______1___________ Ответ 2_______1
3 ______1___________ Ответ 3_______0


Пользователь ответил на вопрос правильно
cms_testing_user_answer
id | question_id | answer_id 
1 ______1___________ 1
2 ______1___________ 2

Пользователь ответил на вопрос не правильно
cms_testing_user_answer
id | question_id | answer_id 
1 ______1___________ 1
2 ______1___________ 3

Пользователь ответил на вопрос не правильно
cms_testing_user_answer
id | question_id | answer_id 
1 ______1___________ 1

Пользователь ответил на вопрос не правильно
cms_testing_user_answer
id | question_id | answer_id 
1 ______1___________ 1
1 ______1___________ 3


Вообщем вот, удалось составить корректный запрос
SELECT
	qanswer.question_id
FROM
	cms_testing_answer qanswer
LEFT JOIN cms_testing_user_answer uanswer ON uanswer.answer_id = qanswer.id
WHERE qanswer.is_correct=1
GROUP BY qanswer.question_id
HAVING COUNT(qanswer.id)=COUNT(uanswer.id)
  • Вопрос задан
  • 180 просмотров
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov Куратор тега MySQL
Web developer
Научитесь формулировать ТЗ правильно. Что считать "правильным ответом" при многовариантности?
- 9 ответов из 10 правильных - это "правильно"?
- все 10 из 10 правильных и 1 из неправильных - "это "правильно"?

Update: если "правильно" - это все правильные вопросы и ни одного неправильного, то для каждого question надо сделать "правильный" отпечаток и сравнить его с отпечатком ответа юзера.

"Правильный" отпечаток:
SELECT question_id, GROUP_CONCAT(id ORDER BY sort ASC SEPARATOR '_')
FROM cms_testing_answer
WHERE is_correct = 1
GROUP BY question_id

(можно использовать другой сепаратор или бинарные сдвиги).
Для оптимизации этот отпечаток можно хранить в БД в cms_question, чтобы каждый раз не выполнять повторно.

Отпечаток ответа юзера - аналогично.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы