我有4张桌子A,B,C& D如下:
B belongs to A
B belongs to C
&安培;
C has many D
因为'A'可能有也可能没有任何B,但是如果有B,那么B必须有C.而且根据我的逻辑,C将至少有一个D或者可能更多。
现在,我想得到A的列表,包括count(b)和count(d)。这里count(b)和count(d)可能为零。
所以我到现在所做的事情如下:
@a = A.joins(bs: {c: :ds}).select("a.*, count(b) as count_b, count(d) as count_d").group("a.id")
但最终这不起作用,因为它INNER JOIN
b
与a
。这意味着,如果b
没有对应的a
,那么a
将不在列表@a
中。这就是问题所在。
那么,有什么办法吗?
答案 0 :(得分:0)
尝试左外连接:
@a = A.joins("LEFT JOIN B on A.id=B.a_id INNER JOIN C on C.id=B.c_id INNER JOIN CD on C.id=CD.c_id INNER JOIN D on D.id=CD.d_id")
有关详细信息,请查看此question
答案 1 :(得分:0)
joins
有一个接受字符串的表单。在该字符串中,您可以放置'LEFT OUTER join bs ON bs... = as...'
答案 2 :(得分:0)
我试过了
@a = A.joins("LEFT JOIN B on A.id=B.a_id LEFT JOIN C on C.id=B.c_id LEFT JOIN CD on C.id=CD.c_id LEFT JOIN D on D.id=CD.d_id")
对我有用。