2017-08-25 80 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