我有一个表格问题,有两种问题,即T / F问题和多个选择问题。 是否有可能使动态表格包含问题的一般列和T / F问题的特定列以及多个选择问题?
任何人都可以帮助我如何创建模型来解决这个问题吗?谢谢。
答案 0 :(得分:0)
此解决方案可处理T / F问题和多项选择问题:
答案 1 :(得分:0)
您不能在列中使用MySQL中的动态类型。根据我的理解,你正在构建某种可定制的琐事。这是一种方法,可以让您对问题有不同类型的答案:
您可以使用类似以下内容的查询来检索答案类型: 选择 * 从 问题 LEFT JOIN WHERE
您可以使用类似以下内容的查询来检索正确的答案:
SELECT
Questions.ID,
IF(AnswersTF.ID IS NOT NULL, AnswersTF.Answer, NULL) AS 'TF',
IF(AnswersChoices.ID IS NOT NULL, AnswersChoices.ID, NULL) AS 'Choice',
IF(AnswersNumber.ID IS NOT NULL, AnswersNumber.Answer,NULL) AS 'Number',
FROM
Questions
LEFT JOIN AnswersTF ON
Questions.ID = AnswersTF.QuestionID
LEFT JOIN AnswersChoices ON
Questions.ID = AnswersChoices.QuestionID
LEFT JOIN AnswersNumber ON
Questions.ID = AnswersNumber.QuestionID
WHERE
Questions.ID = ?
或
SELECT
Questions.ID,
CASE
WHEN AnswersTF.ID IS NOT NULL THEN AnswersTF.Answer
WHEN AnswersChoices.ID IS NOT NULL THEN AnswersChoices.ID
WHEN AnswersNumber.ID IS NOT NULL THEN AnswersNumber.Answer
ELSE NULL
END AS 'Answer'
FROM
Questions
LEFT JOIN AnswersTF ON
Questions.ID = AnswersTF.QuestionID
LEFT JOIN AnswersChoices ON
Questions.ID = AnswersChoices.QuestionID AND
AnswersChoices.IsAnswer = 1
LEFT JOIN AnswersNumber ON
Questions.ID = AnswersNumber.QuestionID
WHERE
Questions.ID = ?
您可以使用类似以下内容的查询来检索多个选项:
SELECT
AnswersChoices.ID,
AnswersChoices.Choice,
AnswersChoices.IsAnswer
FROM
Questions
JOIN AnswersChoices ON
Questions.ID = AnswersChoices.QuestionID
WHERE
Questions.ID = ?
大多数时候,关于数据建模的主题有很多好的答案,所以如果您认为我的答案不合适,请随意评论以指定您的请求。希望这有帮助!
答案 2 :(得分:0)
将您的问题及其选择分成不同的表格。有第三个表定义问题及其选项之间的映射。将表格规范化将有助于避免重复True和False等选项组。
这是表模式的粗略UML草图:
您还需要在表中添加主键/外键约束。为简洁起见,我省略了它们。
CREATE TABLE QUESTIONS
(`Question_ID` int, `Question_Text` varchar(50), `Answer_ID` int);
INSERT INTO QUESTIONS
(`Question_ID`, `Question_Text`, `Answer_ID`)
VALUES
(1, 'True/False question?', 1),
(2, 'Multiple-choice question?', 5);
CREATE TABLE OPTIONS
(`Option_ID` int, `Option_Text` varchar(25));
INSERT INTO OPTIONS
(`Option_ID`, `Option_Text`)
VALUES
(1, 'TRUE'),
(2, 'FALSE'),
(3, 'Option 1'),
(4, 'Option 2'),
(5, 'Option 3'),
(6, 'Option 4');
CREATE TABLE QUESTION_OPTIONS
(`QnA_ID` int, `Question_ID` int, `Option_ID` int);
INSERT INTO QUESTION_OPTIONS
(`QnA_ID`, `Question_ID`, `Option_ID`)
VALUES
(1, 1, 1),
(2, 1, 2),
(3, 2, 3),
(4, 2, 4),
(5, 2, 5),
(6, 2, 6);
现在,只需加入表格即可获取问题的所有相关详细信息。
SELECT Option_Text,
CASE
WHEN q.Answer_ID = o.Option_ID THEN 1
ELSE 0
END Is_Answer
FROM QUESTIONS q, OPTIONS o, QUESTION_OPTIONS qo
WHERE qo.Option_ID = o.Option_ID
AND q.Question_ID = qo.Question_ID
AND q.Question_ID = 1
SELECT Option_Text,
CASE
WHEN q.Answer_ID = o.Option_ID THEN 1
ELSE 0
END Is_Answer
FROM QUESTIONS q, OPTIONS o, QUESTION_OPTIONS qo
WHERE qo.Option_ID = o.Option_ID
AND q.Question_ID = qo.Question_ID
AND q.Question_ID = 2
输出 :
+--------------+-----------+
| OPTION_TEXT | IS_ANSWER |
+--------------+-----------+
| TRUE | 1 |
| FALSE | 0 |
+--------------+-----------+
+--------------+-----------+
| OPTION_TEXT | IS_ANSWER |
+--------------+-----------+
| Option 1 | 0 |
| Option 2 | 0 |
| Option 3 | 1 |
| Option 4 | 0 |
+--------------+-----------+
如果您愿意,可以在 SQL Fiddle 调整表格。