首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从数据库中检索数据及其关系

从数据库中检索数据及其关系
EN

Stack Overflow用户
提问于 2021-08-29 14:30:17
回答 2查看 45关注 0票数 1

我正在努力从我的数据库中获取我需要的数据。所以我的结构很直截了当,我有一个试题表

代码语言:javascript
运行
复制
quiz_question
    id (PK)
    question (text)
    type (text)

quiz_answer
    id (PK)
    question_id (FK)
    answer (text)

所以我的数据库看起来有点像一个问题和答案。

代码语言:javascript
运行
复制
quiz_question

id  |   question               |  type
----------------------------------------
1   |   What is your gender    |  radio


quiz_answer 

id  |   question_id   |  answer
------------------------------------
1   |   1             |  Male
------------------------------------
2   |   1             |  Female
------------------------------------
3   |   1             |  Non-binary

因此,我要做的是构建一些JSON来返回问题及其相关的答案,如下所示。

代码语言:javascript
运行
复制
{
    questions [{
        id: 1,
        question: 'What is your gender',
        type: 'radio',
        answers: [
            {
                'Male'
            },
            {
                'Female'
            },
            {
                'Non-binary'
            }
        ]
      }...
    ]
}

我正在尝试形成一个SQL查询,但有点丢失,目前我有

代码语言:javascript
运行
复制
select quiz_question.question, quiz_question.helptext,
        quiz_question.imageurl, quiz_question.questiontype 
FROM quiz_question 
    INNER JOIN quiz_answer on quiz_question.id = quiz_answer.questionId;

但是,这似乎返回了一个奇怪的数据集。那么,我如何查询我的数据库来检索问题及其答案呢?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-29 15:28:58

如我在评论中所述,您可以使用KnexBookshelfSequelize包。

要手动完成此操作,使用可接受的时间复杂度,让我们使用以下基本查询:

代码语言:javascript
运行
复制
SELECT quiz_question.id, quiz_question.question, quiz_question.type, quiz_answer.answer
FROM quiz_question 
    INNER JOIN quiz_answer on quiz_question.id = quiz_answer.question_id;

假设它为您提供了这个数据集,一个由多个对象(行)组成的数组:

代码语言:javascript
运行
复制
const dataset = [
  {
    id: 1,
    question: 'Question 1',
    type: 'radio',
    answer: 'Answer 1 For Q1'
  },
  {
    id: 1,
    question: 'Question 1',
    type: 'radio',
    answer: 'Answer 2 For Q1'
  },
  {
    id: 1,
    question: 'Question 1',
    type: 'radio',
    answer: 'Answer 3 For Q1'
  },
  {
    id: 2,
    question: 'Question 2',
    type: 'radio',
    answer: 'Answer 1 For Q2'
  },
  {
    id: 2,
    question: 'Question 2',
    type: 'radio',
    answer: 'Answer 2 For Q2'
  },
  {
    id: 2,
    question: 'Question 2',
    type: 'radio',
    answer: 'Answer 3 For Q2'
  }
];

现在你需要重新整理东西。您可以在Array.map中使用多个循环并将它们组合起来,或者使用Array.forEach或更好的Array.reduce

代码语言:javascript
运行
复制
let group = dataset.reduce((acc, data) => {
  if (!acc[data.id]) {
    acc[data.id] = {
      id: data.id,
      question: data.question,
      type: data.type,
      answers: []
    }
  };

  acc[data.id].answers.push({ answer: data.answer });
  return acc;
}, {});

这是:

  • 从空对象{}开始,
  • 检查对象是否还没有包含问题id { id: ... },以使用问题数据填充对象,并初始化和空问题{ answers: [] }的答案数组。
  • 将与当前问题id匹配的每个答案推入答案数组中。

最后,group是一个对象,去掉id使您的原始对象数组使用Object.values,它只接受和对象的(键=>值)中的值部分:

代码语言:javascript
运行
复制
let result = Object.values(group);
票数 2
EN

Stack Overflow用户

发布于 2021-08-29 15:05:11

正如RiggsFolly所说,从您要创建的JSON看来,您只需要执行以下操作:

代码语言:javascript
运行
复制
SELECT q.id, q.question, q.questiontype, a.answer AS answers
FROM quiz_question q
INNER JOIN quiz_answer a ON q.id = a.questionId;

但这只是个开始。我认为KeitelDOG是对的,因为您可能想考虑重新排列数据集,假设问题的答案选择以后不会改变。如果其他一些问题有不同类型的答案,比如用户将输入一些信息并将该答案插入,那么最好将它们分开,并在必要时这样做。

要从该联接中获取对象,您可能希望在查询后执行如下操作,假设您在JavaScript中使用了一个答应().query

代码语言:javascript
运行
复制
.then(([rows]) => {
    console.log(rows);
}

这至少会告诉你返回了什么,然后你可以根据你的需要去那里。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68973882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档