我有 4 个表,我想加入这些表以便获取其中必要的数据。
表 A.
id | name | deleted | amount | due_date | status
1 | a | 0 | 10 | 2016-07-18 | Unpaid
2 | b | 0 | 20 | 2016-07-19 | Unpaid
3 | c | 0 | 15 | 2016-07-18 | Unpaid
表B
id | name | due_date | status
1 | a | | Unpaid
2 | b | | Unpaid
3 | c | | Unpaid
4 | d | 2016-07-19 | Unpaid
表C
id | table_d_id | table_a_id
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
表D
id |
1
2
3
我想要做的是检索表 B 中包含 due_date 和未付款状态的数据,并且在表 A 中找不到该数据。
我当前的查询:
SELECT A.*, B.*, C.*, D.*
FROM A
LEFT OUTER JOIN B ON B.name= A.name
INNER JOIN C ON A.id = C.id
INNER JOIN D ON C.id = D.id
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid"))
GROUP BY D.id
此查询当前所做的是,它仅获取表中除表 B 中的 id 4 之外的数据,我希望也能检索到该数据,因为它具有未付费状态。
最佳答案
您应该使用左连接(并且在您的示例中,b.column 是名称而不是数字..)
SELECT A.*, B.*, C.*, D.*
FROM B
LEFT JOIN A_cstm ON A.id = A_cstm.id_c
LEFT JOIN A ON B.name = A.name
INNER JOIN C ON A.id = C.id
INNER JOIN D ON C.id = D.id
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid"))
GROUP BY D.id
表 A_cstm 未在您的模型中描述(为了清楚起见,我已将其删除..) 我已经使用 FROM B 和 left join A 而不是 FROM A .. left join B 更改了连接的顺序
SELECT A.*, B.*, C.*, D.*
FROM B
LEFT JOIN A ON B.name = A.name
INNER JOIN C ON A.id = C.id
INNER JOIN D ON C.id = D.id
WHERE A.deleted=0 AND ((B.due_date < "2016-07-20" AND B.status = "Unpaid") OR (A.due_date < "2016-07-20" AND A.status = "Unpaid"))
GROUP BY D.id
关于mysql - 如何在该表的左连接后使用左外连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38473884/