我正在努力从我的数据库中获取我需要的数据。所以我的结构很直截了当,我有一个试题表
quiz_question
id (PK)
question (text)
type (text)
quiz_answer
id (PK)
question_id (FK)
answer (text)所以我的数据库看起来有点像一个问题和答案。
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来返回问题及其相关的答案,如下所示。
{
questions [{
id: 1,
question: 'What is your gender',
type: 'radio',
answers: [
{
'Male'
},
{
'Female'
},
{
'Non-binary'
}
]
}...
]
}我正在尝试形成一个SQL查询,但有点丢失,目前我有
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;但是,这似乎返回了一个奇怪的数据集。那么,我如何查询我的数据库来检索问题及其答案呢?
谢谢
发布于 2021-08-29 15:28:58
如我在评论中所述,您可以使用Knex、Bookshelf、Sequelize包。
要手动完成此操作,使用可接受的时间复杂度,让我们使用以下基本查询:
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;假设它为您提供了这个数据集,一个由多个对象(行)组成的数组:
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:
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: ... },以使用问题数据填充对象,并初始化和空问题{ answers: [] }的答案数组。最后,group是一个对象,去掉id使您的原始对象数组使用Object.values,它只接受和对象的(键=>值)中的值部分:
let result = Object.values(group);发布于 2021-08-29 15:05:11
正如RiggsFolly所说,从您要创建的JSON看来,您只需要执行以下操作:
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
.then(([rows]) => {
console.log(rows);
}这至少会告诉你返回了什么,然后你可以根据你的需要去那里。
https://stackoverflow.com/questions/68973882
复制相似问题