簡體   English   中英

MySQL查詢優化:多個SELECT IN到LEFT JOIN

[英]MySQL query optimization: Multiple SELECT IN to LEFT JOIN

我通常采用join方法,但在這種情況下我有點困惑。 我什至不確定這是否有可能。 我想知道以下查詢是否可以轉換為left join查詢,而不是使用的多select in查詢:

select 
   users.id, users.first_name, users.last_name, users.description, users.email 
from users 
where id in (
     select assigned.id_user from assigned where id_project in (
            select assigned.id_project from assigned where id_user = 1
                                                               )
            ) 
   or id in (
     select projects.id_user from projects where projects.id in (
            select assigned.id_project from assigned where id_user = 1
                                                                )
            )  

該查詢返回正確的結果集。 但是,我猜選擇選擇assigned.id_project的查詢的重復是浪費的。

您可以從用戶1 a1的項目分配開始。 然后在項目表p找到其他人對那些項目a2和用戶的所有分配。 然后,您要查找的用戶位於a2p 我添加了distinct,以刪除可以通過兩種方式訪問​​的用戶。

select  distinct u.*
from    assigned a1
left join    
        assigned a2
on      a1.id_project = a2.id_project
left join
        project p
on      a1.id_project = p.id
join    user u
on      u.id = a2.id_user
        or u.id = p.id_user
where   a1.id_user = 1

由於兩個子查詢都有一個條件,其中named.id_user = 1,因此我從該查詢開始。 讓我們將該作業稱為“主要作業”。

然后使用“可選”表的左聯接來聯接其余的聯接。 user上使用內部聯接,該內部聯接與鏈接到主要任務的任務用戶或鏈接到主要項目的項目user匹配。

我使用“與眾不同”,因為我假設您希望每個用戶一次,如果他們有一個任務和一個項目(或多個項目),則為事件。

select distinct
  u.id, u.first_name, u.last_name, u.description, u.email 
from 
  assigned a
  left join assigned ap on ap.id_project = a.id_project
  left join projects p on p.id = a.id_project
  inner join users u on u.id = ap.id_user or u.id = p.id_user
where
  a.id_user = 1

這是擺脫重復的另一種方法:

SELECT
  users.id,
  users.first_name,
  users.last_name,
  users.description,
  users.email 
FROM users
WHERE id IN (
  SELECT up.id_user
  FROM (
    SELECT id_user, id_project FROM assigned
    UNION ALL
    SELECT id_user, id         FROM projects
  ) up
  INNER JOIN assigned a
    ON a.id_project = up.id_project
  WHERE a.id_user = 1
)
;

也就是說, assigned表的雙id_user, id_project被合並與那些projects 然后將結果集與user_id = 1項目結合在一起,以獲得與ID 1用戶共享項目的所有用戶的列表。 現在只剩下檢索這些用戶的詳細信息了,在這種情況下,這與查詢中的方法相同,即使用IN子句。

很遺憾地說,我沒有MySQL可以全面測試該查詢的性能,因此不能完全確定它是否比您的原始查詢好,或者比@GolezTrol通過@Andomar 通常,我傾向於同意@GolezTrol的評論 ,即具有簡單(半或任意)連接和重復部分的查詢可能比沒有重復的等效復雜查詢更有效。 然而,最后,測試必須為您揭示最終答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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