我有这个SQL查询,由于我自己缺乏知识和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/>'
);
我想避免将其拆分为两个查询,并将子查询的值以progamatically方式插入主查询中。
答案 0 :(得分:3)
这可能不是你想要的,但是,我将贡献我的2美分。首先,您应该向我们展示您的架构以及您尝试使用该查询完成的内容。但是从它的外观来看,你没有在表中使用数字ID而是使用varchar字段来连接表,这在性能方面并不是一个好主意。我也不确定你为什么这样做:
(select PrinterName, UserName
from PrintJobs) AS Table1
而不只是加入PrintJobs?这个类似的东西:
(select
PrinterName,
PrinterGroup
from Printers) as Table1
也许我只是没有看到它。我建议您尽可能简化查询并尝试一下。还要告诉我们您希望通过查询完成什么,并为我们提供一些可供使用的模式。
从答案中删除了错误的查询。
答案 1 :(得分:1)
你的这个查询非常混乱,不确定这是否会处理你需要的所有东西但是这样简化会杀死所有嵌套查询并且速度更快。您还可以使用EXPLAIN
命令了解mysql将如何获取查询。
SELECT DISTINCT PrintJobs.UserName
FROM PrintJobs
LEFT JOIN Printers ON PrintJobs.PrinterName = Printers.PrinterName
AND Printers.Username = '<username/>'
;