1

在执行以下查询时,面临“查询期间与 MySQL 服务器的连接丢失”错误。我该如何解决?

SELECT * 
FROM firmalar,
     musterisahipleri,
     notlar 
WHERE firmalar.firmaID NOT IN (
       SELECT m2.firmaID 
       FROM notlar AS n2,
            musterisahipleri AS m2
       WHERE n2.eklemeTarihi > '2013-03-24'
   ) 
   AND musterisahipleri.firmaID = firmalar.firmaID 
   AND notlar.ilgiliID = musterisahipleri.userID;

谢谢你的帮助

4

2 回答 2

5

您正在超时,因为您使用的是低效的嵌套子查询。

这将表现得更好:

编辑:根据您的最后一条评论,此查询将返回自“2013-03-24”以来未添加firmalar任何notlar记录的记录......然后它会一次又一次地加入这些结果以获得相关的代表musterisahiplerinotlar注释(如果适用)

SELECT *
FROM (
    SELECT f.* 
    FROM firmalar AS f
    LEFT JOIN musterisahipleri AS m
        ON m.firmaID = f.firmaID
    LEFT JOIN notlar AS n
        ON n.ilgiliID = m.userID
        AND n.eklemeTarihi > '2013-03-24'
    GROUP BY f.firmaID
    HAVING MAX(n.ilgiliID) IS NULL
) AS f
    LEFT JOIN musterisahipleri AS m
        ON m.firmaID = f.firmaID
    LEFT JOIN notlar AS n
        ON n.ilgiliID = m.userID

您还应该确保在要加入的列上有索引,例如

ALTER TABLE firmalar ADD INDEX (firmaID);
ALTER TABLE musterisahipleri ADD INDEX (firmaID);
ALTER TABLE musterisahipleri ADD INDEX (userID);
ALTER TABLE notlar ADD INDEX (ilgiliID);
于 2013-05-25T11:54:27.443 回答
1

您可以not in通过 MySQL 将旧版本中的子查询替换为not exists. 适当的索引肯定会有所帮助(正如 Steven Moseley 推荐的那样。

此版本将连接移动到from子句中并替换not innot exists

SELECT * 
FROM firmalar join
     musterisahipleri 
     on musterisahipleri.firmaID = firmalar.firmaID join
     notlar 
     on notlar.ilgiliID = musterisahipleri.userID
WHERE not exists (select 1
                  FROM notlar n2 join
                       musterisahipleri m2
                       on n2.ilgiliID = m3.userID
                 WHERE n2.eklemeTarihi > '2013-03-24' and
                       firmalar.firmaID = m2.firmaID
                )

在写这篇文章时,我意识到原始查询的问题是not in子查询中的表没有正确连接在一起。这再次强调了为什么正确的连接语法(在子句中使用joinandon关键字from)优于子句中的隐式连接where

于 2013-05-25T13:09:25.733 回答