Rails 求一个 SQL 的写法

hw676018683 · July 26, 2016 · Last by hw676018683 replied at July 26, 2016 · 1756 hits
class A < ActiveRecord::Base
  has_many :bs
end
class B < ActiveRecord::Base
  belongs_to :a
end

A 表

id name
1 哈哈_1
2 哈哈_2
3 哈哈_3
4 哈哈_4
5 哈哈_5

B 表

id a_id column_1 column_2
1 2 a 100
2 2 b 101
3 3 a 102
4 3 b 101
5 4 a 100
6 4 b 102

问题

想找出 B 中 如果column_1a,那么column_2100; 同时 如果column_1b,那么column_2101 所有对应的 A

目前想到的解决方式: A join 两次 B 表 A.joins("INNER JOIN B B_1 ON B_1.a_id = as.id").joins("INNER JOIN B B_2 ON B_2.a_id = as.id").where("(B_1.column_1 = a AND B_1.column_2 = 100) AND (B_2.column_1 = b AND B_2.column_2 = 101)") 如果这样,条件变成 100 个,那不是得 join 100 次

1 Floor has deleted

#1 楼 @kevinyu 这样 100 个条件就是 100 + 1 次查询

3 Floor has deleted

B.where('(column1 = a AND column2 = 100) OR (column_1 = b AND column)') 这样能把需要的 A 都查出来了吧,条件再多也只要增加 where 的条件,不用增加查询次数。

#4 楼 @aczero 使用OR找出来的不符合要求,就比如上面的例子,符合的只有 id 为 2 的符合,你找出来的 2,3,4 都符合

#5 楼 @hw676018683 噢噢,理解错意思了。可以这样写 B.select('a_id, COUNT(id) as match_count').where("(column1 = 'a' AND column2 = 100) OR (column1 = 'b' AND column 2 = 101)").group('a_id') 只有 match_count 等于 2(其实就是条件数)的记录才是满足所有条件的。

补充: 加上having就能直接筛选出符合条件的记录了: B.select('a_id, COUNT(id) as match_count').where("(column1 = 'a' AND column2 = 100) OR (column1 = 'b' AND column 2 = 101)").group('a_id').having('COUNT(id) >= 2')

You need to Sign in before reply, if you don't have an account, please Sign up first.