Mysql (LEFT) ПРИСОЕДИНЯЙТЕСЬ, как объяснить такое поведение? - PullRequest
3 голосов
/ 17 февраля 2012

С LEFT JOIN

SET @foo:=0;
SELECT @foo 
FROM test t1 
  LEFT JOIN test t2 ON t2.id=t1.id AND (@foo:=@foo+1);

печатает 0,0,0,0,0,0,0…

, но с JOIN

SET @foo:=0;
SELECT @foo 
FROM test t1 
   JOIN test t2 ON t2.id=t1.id AND (@foo:=@foo+1);

отпечатки 1,2,3,4,5,6…

Кто-нибудь знает?Спасибо!

UPD.Эти запросы производят те же строки за исключением значения @foo

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Назначения для переменных сеанса не работают внутри предложения ON.

Причина, по которой вы видите увеличение @foo для INNER JOIN, заключается в том, что оптимизатор выполняет ваш запрос как:

SET @foo:=0;
SELECT @foo 
FROM test t1 
   JOIN test t2 
   WHERE t2.id=t1.id AND (@foo:=@foo+1);

Используя EXPLAIN SELECT..., вы должны увидеть using where в дополнительном столбце.

Вы также можете использовать EXPLAIN EXTENDED SELECT..., а затем SHOW WARNINGS, чтобы увидеть, как именно оптимизатор выполняет ваш запрос.

В вашем случае запрос LEFT JOIN выполняется точно так, как он написан, поскольку для этого типа объединения вы можете получить разные результаты для одного и того же условия в ON и WHERE.

Если вы хотите увеличить @foo для LEFT JOIN, используйте:

SET @foo:=0;
SELECT @foo 
FROM test t1 
  LEFT JOIN test t2 ON t2.id=t1.id
  WHERE @foo:=@foo+1
0 голосов
/ 17 февраля 2012

Вы упомянули, чтобы выбрать некоторые дополнительные данные из вашей таблицы t1?
Разница между обеими операциями может быть в поведении LEFT JOIN.LEFT JOIN пытается присоединиться в соответствии с правилами.Он выбирает запись из набора данных слева и пытается присоединиться к дополнительным данным из набора данных справа.Если совпадений нет, все столбцы набора данных справа устанавливаются в NULL и объединяются.Обычное JOIN пропускает записи, в которых невозможно выполнить JOIN.

id
--
1
2
3
4

LEFT JOIN выбирает запись a, пытается присоединиться к другим записям.Каждая запись, чей идентификатор не похож на идентификатор, приведет к ошибке соединения.Но LEFT JOIN не пропускает эти записи, потому что необходимые левые данные (запись a) доступны.Таким образом, результирующая запись заполняется значениями NULL для объединенной записи, и foo не увеличивается.

0 голосов
/ 17 февраля 2012

Возможно, движок mysql не проверяет второе условие в последовательности AND, если первое возвращает false, что возможно с помощью LEFT JOIN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...