2013-05-25 2 views
1

Выполняя нижеследующий запрос, обратившись к ошибке «Потерянное подключение к MySQL-серверу во время запроса». как я могу это исправить?Как я могу исправить этот sql-запрос?

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; 

Спасибо за вашу помощь

+0

Ошибка выглядит мне как тайм-аут. Кажется, у вас очень сильное соединение в вашем подзапросе, возможно, если вы разобрались, все это закончится быстрее? – nurdglaw

+0

Этот вопрос очень расплывчатый ... какие данные содержатся в вашей базе данных? Похоже, ваш запрос обрабатывает большой набор данных и время ожидания? Взгляните на этот вопрос: http://stackoverflow.com/questions/1884859/lost-connection-to-mysql-server-during-query –

+0

Как говорили другие, скорее всего, тайм-аут. Трудно видеть, где, хотя из waht вы разместили. Структуры таблиц (или соответствующие биты), любые индексы и объяснение могут помочь нам вам помочь. Наряду с использованием правильного синтаксиса .. –

ответ

5

Вы таймаут, потому что вы используете неэффективные вложенные подзапросы.

Это будет работать лучше:

EDIT: На ваш последний комментарий, этот запрос вернет вам firmalar записи, у которых нет notlar записей не добавлены с «2013-03-24» ... он затем присоединяется эти результаты на musterisahipleri и notlar снова, чтобы получить соответствующие повторений и примечания (если применимо)

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); 
+2

Swift, я просто набрал что-то вроде этого. –

+0

Спасибо, Тони. Приветствия. –

+0

@ Тони Хопкинсон, скорость! –

1

Вы можете ускорить not in подзапросов в старых версиях MySQL, заменив их not exists. Соответствующие показатели, безусловно, поможет (в соответствии с рекомендациями Стивен Мозли

Эта версия перемещает присоединяется в пункте from и заменяет not in с not 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 были неправильно соединены друг с другом. Это еще раз подчеркивает, почему правильный синтаксис соединения (с использованием ключевых слов join и в предложении from) превосходит неявные соединения в предложении where.

Смежные вопросы