所以我有以下SQL从三个表中提取数据:
SELECT * FROM QuizQuestions qq
INNER JOIN LNK_Quiz_QuizQuestion lqq ON qq.QuizQuestionID = lqq.QuizQuestionID
INNER JOIN Quiz q ON lqq.QuizID = q.QuizID
WHERE q.QuizID = 4
因此它基本上通过链接表获取属于测验的问题列表。
在解析为JSON时给我以下结果 :http://pastebin.com/Jf19axDs
但是因为我希望所有列和一些列具有相同的名称,所以响应具有一些重复的值,例如"IsEditable": [false, true],
这真的很糟糕,因为我需要知道Quiz或QuizQuestion是否可编辑,并且我想知道它所属的对象。
因此SQL的理想回报将是:
{
"Quiz": {
"IsEditable": false
},
"QuizQuestion": {
"IsEditable": true
}
}, {
"Quiz": {
"IsEditable": false
},
"QuizQuestion": {
"IsEditable": true
}
}
我如何用SQL实现这一目标?我使用的是SQL Server。
注意:关于使用SELECT *
,这是为了便于在此示例中使用,并且不应该是问题的原因,因为即使我将列命名为:
SELECT q.IsEditable, qq.IsEditable
返回
"IsEditable": [false, true]
或者甚至给他们别名:
SELECT q.IsEditable AS QuizIsEditable, qq.IsEditable AS QuizQuestionIsEditable
返回
"QuizIsEditable": false,
"QuizQuestionIsEditable": true
更新:在考虑了这个之后,似乎我需要拆分SQL查询然后分别创建每个对象。这是正确的吗?
答案 0 :(得分:1)
你将不得不将其分解为2个查询,没有办法解决它。您将无法只对数据库中的原始结果进行json编码。首先选择测验作为应用程序中的对象,为其提供“问题”属性,其值将是第二个查询的结果,以获取所有问题。把它解析成json,你应该很好。
SELECT * FROM Quiz WHERE QuizID = 4;
这产生了一些像这样的对象:
var quizQueryResult = db.execute("SELECT * FROM Quiz WHERE QuizID = 4;")
// returns something like this,
// an array of result objects: [{QuizID: 4, IsEditable: true, etc...}];
var myQuiz = queryResult[0]; //the only result from the DB
var questionsQueryResult = db.execute("SELECT qq.* FROM QuizQuestions qq
JOIN LNK_Quiz_QuizQuestion lqq ON qq.QuizQuestionID = lqq.QuizQuestionID
WHERE lqq.QuizID = 4;");
// questionsQueryResult is now an array or some collection of QuizQuestions.
myQuiz.Questions = questionsQueryResult;
response.Body = jsonEconde(myQuiz);