MYSQL ГДЕ-В Подзапрос выполняется навсегда - PullRequest
7 голосов
/ 30 августа 2010

У меня есть таблица MySQL. Давайте назовем это виджетами. Таблица виджетов имеет 3 поля: id , type_id и name . В одном запросе я хочу получить все виджеты, которые имеют type_id с виджетом с именем 'doodad'. Я написал 2 запроса:

  1. Дайте мне type_id виджета с именем 'doodad'.
  2. Дайте мне все виджеты с этим type_id.

Это работает. Каждый запрос самостоятельно достигает своей цели.

Но когда я объединяю их в один вложенный запрос, он выполняется вечно, в стиле бесконечного цикла. Это выглядит так:

SELECT * FROM widgets WHERE type_id IN  (
    SELECT type_id FROM widgets WHERE name = 'doodad'
);

Может кто-нибудь объяснить это? Это потому, что я пишу вложенный запрос, который работает с одной и той же таблицей дважды?

Маленькое колесо, почему ты прячешься?

Ответы [ 2 ]

6 голосов
/ 30 августа 2010

Существует проблема в MySQL и in, когда даже некоррелированные подзапросы обрабатываются так, как если бы они были коррелированы и переоценены для каждой строки.

В плане объяснения выберитетип, скорее всего, будет отображаться как dependant subquery, а не просто subquery, как хотелось бы.

Я предлагаю попробовать подход, описанный в конце этой статьи использования производной таблицы дляматериализуйте внутренний набор результатов.

Или вы можете посмотреть на constify процедуру здесь , чтобы узнать, поможет ли она вам обойти эту проблему.

3 голосов
/ 30 августа 2010

Использование JOIN рискует дублировать результаты - EXISTS будет работать аналогично IN без риска дублирования:

SELECT x.* 
  FROM widgets x
 WHERE EXISTS (SELECT NULL
                 FROM WIDGETS y
                WHERE y.name = 'doodah'
                  AND y.type_id = x.type_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...