[英]Convert Sub-query into Joins
我試圖通過聯接轉換下面的查詢,
SELECT DISTINCT req.*
FROM request req
WHERE (req.user_id IN (
SELECT id from user where id in (SELECT user_id FROM team_member team WHERE team.team_id IN ('344', '723')) and user.active = 1
)
OR req.user_id IN (
SELECT id from user where id in (SELECT approved_employee_id from approver where approver_id = '269') and user.active = 1
))
AND req.status = 'pending';
返回124條記錄。
我在下面通過聯接寫了查詢,但是不起作用,
SELECT DISTINCT req.*
FROM request req
LEFT JOIN user u ON u.id = req.user_id AND u.active = 1
LEFT JOIN team_member team ON team.user_id = u.id AND team.team_id IN ('344', '723')
LEFT JOIN approver app ON app.approver_id = u.id AND app.approver_id = '269'
AND req.status = 'pending';
返回超過500條記錄。
此連接有兩個問題,它也包括狀態未決的那些請求。
下面是架構
我有下表
tbl_approver =
id,
approver_id (FK tbl_user),
approver_team_id (FK tbl_team),
approved_employee_id (FK tbl_user)
tbl_team_mambers =
id,
team_id (FK),
user_id (FK)
tble_user =
id,
email,
username
active
tbl_request =
id,
user_id,
status
注意:作為批准者,我可以是許多團隊的成員,但只能是某些團隊的批准者。 還是一些員工。
想要查詢:作為批准者,我希望批准我的團隊的所有請求。
為了獲得join
的正確結果,您需要對任何已聯接的“表”僅返回user_id的一行。 並且如果需要僅在所有表中都存在的行不要使用left
。
SELECT req.*
FROM request req
JOIN user ON user.id=req.user_id
JOIN (
SELECT distinct approved_employee_id as user_id from approver where approver_id = '269'
UNION
SELECT distinct user_id FROM team_member team WHERE team.team_id IN ('344', '723')
) A ON req.user_id=A.user_id
where user.active = 1
AND req.status = 'pending';
或者,如果需要,僅“真實表”:
SELECT DISTINCT req.*
FROM request req
JOIN user u ON u.id = req.user_id AND u.active = 1
LEFT JOIN team_member team ON team.user_id = u.id AND team.team_id IN ('344', '723')
LEFT JOIN approver app ON app.approver_id = u.id AND app.approver_id = '269'
WHERE req.status = 'pending'
AND (team.user_id is not null OR app.approver_id is not null)
SELECT DISTINCT req.*
FROM request req
LEFT JOIN user u ON u.id = req.user_id AND u.active = 1
...
這將選擇所有不重復的記錄request
,並JOIN
他們的用戶。 ON
之后的join_condition
將僅影響join_condition
關系。
如果在LEFT JOIN的ON或USING部分中沒有右表的匹配行,則將所有列都設置為NULL的行用於右表。
如果您確實想使用LEFT JOIN
過濾request
所有記錄, request
考慮將condition_expr
移至WHERE
SELECT DISTINCT req.*
FROM request req
LEFT JOIN user u ON u.id = req.user_id
...
WHERE u.active = 1
AND ...
如果您只需要滿足用戶連接條件的request
,則應考慮使用Join
而不是LEFT JOIN
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.