2017-08-25 79 views
1

我有一个查询根据表名为users的表中的记录ID查找人员的全名。全名与他们在另一个表中的角色绑定(table1)。这需要多加入到users表:MySQL:在一个表上存在多个连接时计入NULL或0的值

SELECT table1.id, users.full_name AS "Requester", 
users.full_name AS "Approver," 
users.full_name AS "Ordered By", 
users.full_name AS "Received By" 
FROM table1 
JOIN users AS users 
ON table1.requester_id = users.id 
JOIN users AS users2 
ON table1.approver_id = users2.id 
JOIN users AS users3 
ON table1.ordered_by = users3.id 
JOIN users AS users4 
ON table1.received_by = users4.id 
WHERE table1.deleted_record !=1; 

我遇到的问题是与ordered_byreceived_by。通常,它们还不存在,因为订单既未被排序也未被接收,因此每个订单的ID可以为0,在users表中没有相应的值。当我运行这个查询时,我应该找回所有存在的475条记录,但由于这些0值,我只返回365。如何修改此查询以确保返回所有行,即使ordered_by和/或received_by = 0?

回答

1

您正在寻找left join

SELECT t1.id, ur.full_name AS "Requester", 
     ua.full_name AS "Approver," 
     uo.full_name AS "Ordered By", 
     urv.uo AS "Received By" 
FROM table1 t1 LEFT JOIN 
    users ur 
    ON t1.requester_id = ur.id LEFT JOIN 
    users ua 
    ON t1.approver_id = ua.id LEFT JOIN 
    users uo 
    ON t1.ordered_by = uo.id LEFT JOIN 
    users urv 
    ON t1.received_by = urv.id 
WHERE t1.deleted_record <> 1; 

注意,我改变了别名的users引用从相当意义u1u2等来uauo,等等。此外,这些需要用于SELECT以获得正确的全名。

+0

感谢。当我没有得到我想要的结果时,我开始使用INNER JOIN并支持这些。左加入固定它。 – Chris

2

首先,驱动查询的主表应该是table1。然后,您正在使用JOIN而不是LEFT JOIN。如果没有链接,LEFT JOIN会给你一个空结果,但不会失败。在这种情况下,你可能必须使用一个IF您的领域重视

SELECT table1.id, req.full_name AS "Requester", 
    app.full_name AS "Approver", 
    ordr.full_name AS "Ordered By", 
    rec.full_name AS "Received By" 
FROM table1 
LEFT JOIN users AS req 
    ON table1.requester_id = req.id 
LEFT JOIN users AS app 
    ON table1.approver_id = app.id 
LEFT JOIN users AS ordr 
    ON table1.ordered_by = ordr.id 
LEFT JOIN users AS rec 
    ON table1.received_by = rec.id 
WHERE table1.deleted_record !=1; 

这应该这样做

+0

table1确实驱动查询。我输入了错误的表名。现在已经修复了。 – Chris