2015-10-04 71 views
0

我有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的计数(b)以及计数(d)。这里计数(b)和计数(d)可能为零。

所以我在做什么至今如下:
@a = A.joins(bs: {c: :ds}).select("a.*, count(b) as count_b, count(d) as count_d").group("a.id")
但最终这是行不通的,因为它INNER JOINba。这意味着,如果a没有相应的b,那么a将不在列表@a中。那就是问题所在。

那么,有没有办法做到这一点?

回答

0

尝试LEFT OUTER JOIN:
@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

+0

你说得对。如果只有A和B,它就可以工作。但我不知道,哪一个适用于B/C,C-CD和CD-D。我希望,我在解释时并没有模棱两可。 –

+0

你可以尝试修改后的解决方案(并告诉我如果没有工作是什么问题) – pshoukry

+0

其实我早些时候尝试过,但没有奏效。我试过'@a = A.joins(“A.id = B.a_id上的LEFT JOIN B C.id = B.c_id上的LEFT JOIN CD C.id = CD.c_id上的LEFT JOIN CD LEFT JOIN D. ID = CD.d_id“)'而不是为我工作。 –

0

joins有它接受一个字符串的形式。在那个字符串中,你可以放'LEFT OUTER join bs ON bs... = as...'

+0

我试着写'A.joins(“左连接B上A.id = B.a_id左连接C上C.id = B.c_id左上JOIN CD上C.id = CD.c_id左连接D上D.id = CD.d_id“)'。但是,这并不适合我... –

+0

你是对的。如果只有A和B,它就可以工作。但我不知道,哪一个适用于B/C,C-CD和CD-D。我希望,我在解释时并没有模棱两可。 –

+0

对不起,你从哪里得到一张“CD”表? – nimrodm

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")这对我有效。