[英]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
和用戶的所有分配。 然后,您要查找的用戶位於a2
或p
。 我添加了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.