今天遇到的两个需求,要用到连表查询:
- 有2个表,
users
表和offices
表。他们关系是user belongs to office, office has many users,现在要将用户按照职位等级排序。由于排序的列不在users
表中,不能直接用User.order('level ASC')
,得用到连表查询。
User.joins(:office).order('offices.level ASC')
#
# 下面是生成的sql语句
SELECT "users".*
FROM "users"
INNER JOIN "offices"
ON "offices"."id" = "users"."office_id"
ORDER BY offices.level
- 有2个表,
exams
和questions
,他们之间的关系是exam has one question, question belongs to exam。(表比较奇怪,考试只有一道题)。现在要列出所有没有question的exam。
跟上一个问题一样,查询时要依赖另一个表的列,所以得用连表查询。
Exam.joins("LEFT JOIN questions ON questions.exam_id = exams.id")
.where("questions.id IS null")
#
# 下面是生成的sql语句
SELECT "exams".*
FROM "exams"
LEFT JOIN questions
ON questions.exam_id = exam.id
WHERE (questions.id IS null)
这里用到的是Left join,第一个问题用到的是Inner Join,有啥不同可以看这篇文章用图形来解释sql的join查询。
下次遇到查询数据库的问题,先查该使用哪个sql查询语句,再查rails中如何实现这个sql查询。