2015-10-04 70 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")這對我有效。