在MySQL中避免有问题的嵌套查询

时间:2010-09-05 12:17:48

标签: sql mysql

我有这个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方式插入主查询中。

2 个答案:

答案 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/>'
;