我有三个表,rents[id,contract_id,paid]
、contracts[id, active,unit_id]
和units[id]
.
我需要的是一个查询,该查询将选择所有已支付的租金并且其契约(Contract)处于事件状态,并将该单元加入到记录中。
我尝试过的是:
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条件。
你能帮忙吗?
最佳答案
这里使用 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 作为 true 条件,在这种情况下,WHERE 子句将如下所示:
WHERE r.paid = 1
AND c.active = 1
注意,我已经使用了所有 INNER JOINS,因为您似乎不存在没有契约(Contract)就可以存在租金以及没有单位就可以存在契约(Contract)的情况。即使这是可能的,我也不认为它适用于您的查询,因为您专门寻找契约(Contract)和单位存在的情况。
关于mysql - 3 个表之间的循环连接(或嵌套连接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20503466/