mysql - Golang db.Query with sql join

标签 mysql join go

我想查询一个问题及其所有答案。以下两个函数工作得很好。问题是我认为这应该在一个函数中通过一个查询来完成。 (为简洁起见,我删除了错误检查)。

func QuestionById(id string) (*Question, error) {
    question := new(Question)
    _ = db.QueryRow("select * from question where question.id = ?", id).Scan(
        &question.Id,
        &question.LessonId,
        &question.Body,
        &question.Type,
    )

    return question, nil
}

func AnswersByQuestionId(id string) ([]*Answer, error) {
    rows, _ := db.Query("select * from answer where question_id = ?", id)
    defer rows.Close()

    answers := make([]*Answer, 0)

    for rows.Next() {
        answer := new(Answer)

        _ = rows.Scan(&answer.Id, &answer.Body, &answer.QuestionId, &answer.Correct)

        answers = append(answers, answer)
    }
    _ = rows.Err()

    return answers, nil
}

我想以这种方式(或类似方式)使用连接查询:

func QuestionByIdAndAnswers(id string) (*Question, []*Answer error) {
    rows, _ := db.Query("select * from question join answer on question.id = answer.question_id where question.id = ?", id)

    // more stuff here

    return question, answers, nil
}

最佳答案

一般来说应该是这样的:

func QuestionByIdAndAnswers(id string) (*Question, []*Answer, error) {
  query := `
    SELECT q.id, q.body, a.id, a.question_id, a.body
    FROM question AS q
    JOIN answer AS a ON q.id = a.question_id
    WHERE q.id = ?
  `
  rows, err := db.Query(query, id)
  checkErr(err)

  question := &Question{}
  for rows.Next() {
    answer := &Answer{}
    err = rows.Scan(
      &question.ID,
      &question.Body,
      &answer.ID,
      &answer.QuestionID,
      &answer.Body,
    )
    checkErr(err)
    question.Answers = append(question.Answers, answer)
  }

  return question, question.Answers, nil
}

请注意,我特意换了:
SELECT *SELECT q.id, q.body, a.id, a.question_id, a.body
旨在避免以下错误:
紧急情况:sql:Scan 中预期有 6 个目标参数,而不是 5 个
在表中添加或删除某些列时可能会发生这种情况,因此此查询更健壮。

这只是基本实现,您可以使用更多字段扩展它...

PS:为简洁起见,函数 checkErr 也被省略了。

关于mysql - Golang db.Query with sql join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45637808/

相关文章:

php - 转义插入到 Mysql 中的字符串

linux - 替换两列 linux

mysql - sql查询使用join从2个表中检索数据

php - 这两个查询之间的区别

c# - 如何从 C# 内置的应用程序检测安装并自动启动 MySQL 服务器

python - 使用 Python 将数组插入 mysql

mysql:恢复管理员用户的所有权限

ssl - 如何在 Go ReverseProxy 中使用 TLS?

go - 遍历已解析的CSV时出错,出现紧急情况:运行时错误:索引超出范围[0],长度为0

go - 在golang中嵌入具有相同属性名称的模型结构