Mysql 如何创建具有两种可变列的表格

Mysql 如何创建具有两种可变列的表格,mysql,sql,Mysql,Sql,我有一个表格问题,有两种操作系统问题,T/F问题和多重选择问题。 是否可以制作一个动态表格,其中包含问题的一般列、T/F问题和多个选择问题的特定列 有人能帮我创建模型来解决这个问题吗?谢谢。此解决方案同时处理T/F问题和多项选择题: MySQL中的列不能有动态类型。据我所知,您正在构建某种可定制的琐事。这里有一种方法可以让你对一个问题有不同类型的答案: 您可以使用类似以下的查询来检索答案类型: 挑选* 从…起 问题 左连接 在哪里 您可以使用类似以下的查询来检索正确答案: SELECT

我有一个表格问题,有两种操作系统问题,T/F问题和多重选择问题。 是否可以制作一个动态表格,其中包含问题的一般列、T/F问题和多个选择问题的特定列


有人能帮我创建模型来解决这个问题吗?谢谢。

此解决方案同时处理T/F问题和多项选择题:


MySQL中的列不能有动态类型。据我所知,您正在构建某种可定制的琐事。这里有一种方法可以让你对一个问题有不同类型的答案:

您可以使用类似以下的查询来检索答案类型: 挑选* 从…起 问题 左连接 在哪里

您可以使用类似以下的查询来检索正确答案:

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
    AnswersChoices.ID,
    AnswersChoices.Choice,
    AnswersChoices.IsAnswer
FROM 
    Questions
    JOIN AnswersChoices ON
        Questions.ID = AnswersChoices.QuestionID
WHERE
    Questions.ID = ?

在大多数情况下,关于数据建模的主题有很多很好的答案,因此,如果您认为我的答案不合适,请随意评论以指定您的请求。希望这有帮助

将你的问题和他们的选择分成不同的表格。第三个表定义问题和选项之间的映射。规范化表将有助于避免重复选项组,如True和False

下面是表模式的粗略UML草图:

您还需要向表中添加主键/外键约束。为了简洁起见,我省略了它们

现在,只需连接表即可获取问题的所有相关细节

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
输出


如果您愿意,可以在

上调整表格。发布表格模式。恐怕我没有正确解释我想要什么,我有一个表格问题,但有两种操作系统问题,T/F问题和多选项问题。是否可以使表格问题动态化,以便她能够存储问题的一般列和T/F问题或多个选择问题的特定列。示例一个问题可以是T/F并具有列选项a、文本、isCorrect,或者一个问题可以是多个并具有列更正(V/F)。例如,一个问题可能正是我想要的,非常感谢您的工作和时间。很抱歉打扰您,但问题选项表中的QnA_ID列是必需的?复合键和其他两列(问题ID和选项ID)的效率不会更高吗?@DanielCoelho在这里使用复合键是非常好的。通常,如果组成复合键的列可以更改(因为这样也会触发对索引的更改),则首选代理键。因为,这里我们只有组合中的PK/FKs,这不会是一个问题。就个人而言,我更喜欢单列代理键,因为它们也更容易在查询中加入。完全由你决定。这里两个都很好。
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 |
+--------------+-----------+