首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL嵌套关系

问MySQL嵌套关系
EN

Stack Overflow用户
提问于 2014-08-14 08:57:04
回答 2查看 829关注 0票数 0

我使用脊骨和需要嵌套答案的问题和问题的分类。我的问题是我从MySQL获得的数据。

我希望有一个数组,我可以很容易地使用脊骨,从顶部(类别)和嵌套到底部(答案)。

代码语言:javascript
复制
[Category1: [Question1: [Answer1: {...} ] ] ]

我使用以下查询获取所有MySQL数据:

代码语言:javascript
复制
var getRecord = function(callback) {
  var options = {
    sql: 'SELECT * FROM Categories ' +
         'LEFT JOIN Questions ON Categories.idCategories = Questions.idCategory ' +
         'LEFT JOIN Answers ON Questions.idQuestions = Answers.idQuestion ',
    nestTables: true
  }

  req.app.sql.query(options, function(err, result) {
    if (err)
      return callback(err, null)

    outcome.record = result
    return callback(null, 'done')
  })
}

输出结果如下:

代码语言:javascript
复制
[
   0: [CategoryObj, QuestionObj, AnswerObj]
   1: ...
]

MySQL节点包不嵌套1:n关系,而是创建一个具有大多数匹配长度的数组,因此在这种情况下,我有两个类别,每个类别有两个问题,每个答案的->数组长度为8,因为我总共有8个答案。但是,如果不编写疯狂的循环和黑客,我就无法在主干集合中嵌套这个数组。

我是在查询中做错了什么,还是有一个包完成了解析工作?

(我已经习惯了MongoDB (使用嵌入式文档非常容易),现在我不得不在这个项目中使用MySQL。

这是npm上的MySQL节点包

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-14 15:25:44

最后我自己解析了它。由于某些原因,我找不到一个工作良好的ORM助手,可以为我做这份工作。无论如何,我试图避免这个解决方案,但在这里,如果你有同样的问题,有一天,这可能会有所帮助。

代码语言:javascript
复制
var async = require('async')

var getAnswers = function (id, callback) {
  req.app.sql.query('SELECT * FROM Answers WHERE idQuestion LIKE ?', [id], function(err, result) {
    if (err)
      return callback(err, null)

    return callback(null, result)
  })
}

var getQuestions = function (id, callback) {
  req.app.sql.query('SELECT * FROM Questions WHERE idCategory LIKE ?', [id], function(err, result) {
    if (err)
      return callback(err, null)

    // Pair answers to questions
    async.times(result.length, function(n, next) {
      getAnswers(result[n].idQuestions, function (err, answers) {
        result[n].answers = answers
        next(err, result[n])
      })
    }, function(err, questions) {
      callback(null, questions)
    })
  })
}

var getRecord = function(callback) {
  req.app.sql.query('SELECT * FROM Categories', function(err, result) {
    if (err)
      return callback(err, null)

    // Pair questions to categories
    async.times(result.length, function(n, next) {
      getQuestions(result[n].idCategories, function (err, questions) {
        result[n].questions = questions
        next(err, result[n])
      })
    }, function(err, final) {
      callback(null, final)
    })

  })
}

var asyncFinally = function(err, results) {
  if (err)
    return next(err)

  // we call results[0] because async.times leaves all the categories in there..
  // sendSomewhere( results[0] )
}

async.parallel([getRecord], asyncFinally)
票数 0
EN

Stack Overflow用户

发布于 2014-08-14 14:58:33

这个包没有什么问题,也没有你如何使用它的问题。它只给出MySQL返回的结果。您可能知道,当您处理1:n关系时,MySQL本身并不以“嵌套”方式格式化其结果。如果使用联接,它将为找到的每个结果提供一个带有一行的表。由于它是“表形成的”结果,所有行都有相同数量的单元格。

例如,您可以尝试在PHPmyAdmin中查看请求的结果。

因此,您必须对结果进行后期格式化。可能有一些模块可以做到这一点,但我还没有使用过。

如果你想自己做这件事,你可以这样做:

代码语言:javascript
复制
var nestedResult = {};
result.forEach(function(val){
   var category = val[0],
       question = val[1],
       answer = val[2];
   if (!nestedResult[category]){
       nestedResult[category] = {};
   }
   if (!nestedResult[category][question]){
       nestedResult[category][question] = [];
   }
   nestedResult[category][question].push(answer);
});

这会给你这样的感觉:

代码语言:javascript
复制
{
  "mysql" : {
      "what is JOIN" : ["answer 1 blabla....","answer 2 blabla"],
      "innoDB vs MyISAM" : ["answer 1","answer 2"]
  },
  "php" : {
      "why no php 6 ?" : ["answeeeerr"]
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25304008

复制
相关文章

相似问题

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