2010-09-05 164 views
1

我有這個SQL查詢,這是由於我自己對MySQL處理嵌套查詢缺乏​​知識和問題,實際上處理起來很慢。查詢是...在MySQL中避免有問題的嵌套查詢

SELECT DISTINCT PrintJobs.UserName 
FROM  PrintJobs 
LEFT JOIN Printers 
ON  PrintJobs.PrinterName = Printers.PrinterName 
WHERE  Printers.PrinterGroup 
IN  (
       SELECT DISTINCT Printers.PrinterGroup 
       FROM  PrintJobs 
       LEFT JOIN Printers 
       ON  PrintJobs.PrinterName = Printers.PrinterName 
       WHERE  PrintJobs.UserName='<username/>' 
     ); 

我想避免將其分解爲兩個查詢,並將子查詢的值插入主查詢主動。

回答

3

這可能不是你正在尋找的東西,但是我會貢獻我的2美分。首先,您應該向我們展示您的架構,以及您試圖用該查詢完成的內容。然而,從它的外觀來看,你並沒有在表中使用數字標識,而是使用varchar字段來連接表,這在性能方面並不是一個好主意。我也不知道你爲什麼這樣做:

(select PrinterName, UserName 
     from PrintJobs) AS Table1 

而不是隻加入PrintJobs?這個相似的東西:

(select 
     PrinterName, 
     PrinterGroup 
     from Printers) as Table1 

也許我只是沒有看到它的權利。我建議您儘可能簡化查詢並嘗試。同時告訴我們你希望用查詢完成的事情,並給我們一些工作方案。

從答案中刪除了錯誤的查詢。

+0

同意,表1看起來很可疑。投票刪除它=) – 2010-09-05 12:53:11

+0

這個想法是選擇與用戶相同的「打印組」的成員的所有用戶。表PrintJobs(id,UserName,PrinterName),表格Printers(PrinterName,PrinterGroup)。 PrintJobs表包含很多其他不相關的字段。我希望只是加入子查詢會更好,我想不會,我會刪除它。 – Ablue 2010-09-05 12:53:18

+0

好吧,看起來好多了,它在子查詢和主要查詢中分別節省大約1/2秒。 – Ablue 2010-09-05 13:10:36

1

你有這個查詢是相當混亂,不知道這是否會處理你需要的一切,但像這樣簡化將殺死所有的嵌套查詢,它的方式更快。您也可以使用EXPLAIN命令來了解mysql如何獲取您的查詢。

SELECT DISTINCT PrintJobs.UserName 
FROM  PrintJobs 

LEFT JOIN Printers ON PrintJobs.PrinterName = Printers.PrinterName 
AND Printers.Username = '<username/>' 
; 
+0

我喜歡它。除了它似乎沒有工作。 (我假設你的意思是PrintJobs.Username =)。這將返回PrintJobs表中的所有不同用戶。 – Ablue 2010-09-05 13:00:50