簡體   English   中英

將子查詢轉換為聯接

[英]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
  • 團隊成員:用戶是多個團隊的成員。
  • 批准人:
    • 每個團隊都有一個批准人,該批准人也是該團隊的成員。
    • 無論團隊如何,都可以直接批准員工。
  • request:用戶的庫存請求

注意:作為批准者,我可以是許多團隊的成員,但只能是某些團隊的批准者。 還是一些員工。

想要查詢:作為批准者,我希望批准我的團隊的所有請求。

為了獲得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)

觀看LEFT JOIN語法,這是聯接直觀表達

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的行用於右表。

來自Mysql文檔的聯接語法

如果您確實想使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM