2013-12-10 55 views
0

我有三個表,rents[id, contract_id, paid]contracts[id, active, unit_id]units[id]
我需要的是一個查詢,它將選擇支付的所有租金,並且他們的合同處於活動狀態,並將單位加入記錄。3個表之間的圓形連接(或嵌套連接)

我曾嘗試是:

SELECT * FROM `rents` AS Rent 
LEFT JOIN units AS Unit 
    INNER JOIN contracts AS Contract 
    ON (Unit.id = Contract.unit_id AND Contract.active=true) 
ON Rent.unit_id = Unit.id 
WHERE Rent.paid = true 

返回的行接近,我只收到了支付租金,與單位 - 但是,它忽略了contract.active條件。

你能幫忙嗎?

回答

1

你必須要小心SELECT *這裏因爲你有不同領域的常用字段名稱id。這是很好的做法,只列出你想要的實際字段:

SELECT 
    r.id AS `rent_id`, 
    c.id AS `contract_id`, 
    u.id AS `unit_id` 
FROM rents AS r 
INNER JOIN contracts AS c 
    ON r.contract_id = c.id 
INNER JOIN units AS u 
    ON c.unit_id = u.id 
WHERE r.paid = 'true' 
AND c.active = 'true' 

另外請注意,我把true在單引號,因爲我假設你正在使用這個領域的文本字符串。你實際上可能考慮使用TINYINT領域,真正的條件設定值爲1,在這種情況下,WHERE子句將看起來像:

WHERE r.paid = 1 
AND c.active = 1 

注意我用所有的內部連接,因爲它似乎沒有你的情況下沒有合同就可能存在租金,沒有單位就可能存在合同。即使這是可能的,我不認爲它適用於你的查詢,因爲你正在尋找合同和單位存在的情況。

+1

'差不多'? ;-)。 – Strawberry

+1

@Strawberry幾乎是什麼?謹慎闡述?啊沒關係。我想你是在談論這種「幾乎總是好的做法」。那麼我是溫柔的,因爲我個人不會允許這種用法在我的代碼庫中進行簡單的選擇。 –

+0

謝謝! @MikeBrant。 對內部變化的左右是正確的,沒有想過它。只是一個問題:根據我的理解,您的解決方案有效,使用「加入」條件比「where」條件具有更好的性能? – yossi

1

嘗試走動一點,擺脫LEFT JOIN的另一個INNER你的邏輯(因爲沒有單位,你不能有一個合同)

SELECT * 
FROM `rents` AS Rent 
INNER JOIN units AS Unit 
    ON Rent.unit_id = Unit.id 
INNER JOIN contracts AS Contract 
ON Unit.id = Contract.unit_id 
WHERE Rent.paid = true 
    AND Contract.active=true 
+0

謝謝。 @AgRizzo – yossi

+0

剛纔注意到,你有一個錯誤,我沒有unit_id col'租金 – yossi

+0

@yossi - 錯誤?我複製了你的查詢。這些是你的帖子中的相同連接。 – AgRizzo