3个表之间的循环连接(或嵌套连接)

时间:2013-12-10 19:26:21

标签: mysql join circular-dependency nested

我有三张表,rents[id, contract_id, paid]contracts[id, active, unit_id]units[id] 我需要的是一个查询,它将选择已支付的所有租金以及他们的合同是否有效,并将该单位加入到记录中。

我试过的是:

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条件。

你能帮帮忙吗?

2 个答案:

答案 0 :(得分:1)

尝试稍微移动你的逻辑并摆脱另一个INNER的LEFT JOIN(因为没有单位,你不能签合同)

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

答案 1 :(得分: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

注意我已经使用了所有INNER JOINS,因为它似乎没有一个没有合同可以存在租金并且没有单位的合同可能存在的情况。即使这是可能的,我也不认为它适用于您的查询,因为您专门寻找合同和单位存在的情况。