![]() |
|
Задавайте вопросы, мы ответим
Вы не зашли.
select * from table_nm1 left join table_nm2 on table_nm1.id=table_nm2.nm1_id where table_nm2.pk is null;
результат запроса выведет все строки, которые удовлетворяют условию и те строки, для которых запись в table_nm2 не существует.
вопрос: как mysql находит те строки из table_nm1, для которых нет записей в table_nm2 ?
Неактивен
Никак. В результирующей выборке у вас последовательно будут идти поля из table_nm1 и из table_nm2. Если при объединении соответствия не задано, то будет выведена данная строка из таблицы table_nm1, а поля таблицы table_nm2 будут заполнены значением NULL.
Если Вам такие строчки не нужны, то используйте INNER JOIN (или просто JOIN) вместо LEFT JOIN.
Неактивен

Если я правильно понял, то вопрос был о механизме поиска. Если да — то механизм простой:
Берется каждая строка из nm1 и ищется соответствующая строка в nm2. Если она не найдена,
то она попадает в выборку.
Разумеется, индексы используются. На nm2.
Неактивен
да, вопрос по механизму поиска.
строки, которых нет, могут и не удовлетворять условию:
where table_nm2.pk=12;
откуда MySQL знает, что надо искать все строки из nm1, для которых нет соотвествия в nm2?
возможно, сначала берётся пустая строка nm2 и проверяется, удовлетворяет ли она условиям фильтра, если удовлетворяет, то надо искать строки nm1, если не удовлетворяет, то не надо. как думаете?
Неактивен

Честно говоря, не понимаю, откуда взялось магическое «12» ![]()
Напишите, пожалуйста, полный запрос — тогда, скорее всего, получите полный ответ ![]()
P.S. Разумно дополнить я ничего не могу, т.к. множества table_nm2.pk=12 и table_nm2.pk is null не пересекаются.
Неактивен
select * from table_nm1 left join table_nm2 on table_nm1.id=table_nm2.nm1_id where table_nm2.pk is null;
строки, которых нет в table_nm2, удовлетворяют условию.
select * from table_nm1 left join table_nm2 on table_nm1.id=table_nm2.nm1_id where table_nm2.pk=12
строки, которых нет, не удовлетворяют условию.
как mysql выполняет проверку условия where?
Неактивен
Попробую на примере объяснить, как работает JOIN и WHERE. Есть таблица А с колонками fa1 и fa2 и есть таблица B с колонками fb1 и fb2. Заполним их данными:
fa1 fa2
1 a
2 b
3 c
fb1 fb2
1 q
3 w
5 e
Теперь выполним запрос SELECT * FROM A LEFT JOIN B ON A.fa1 = B.fb1 WHERE B.fb2 is NULL Сначала MySQL объединит две таблицы в множество:
fa1 fa2 fb1 fb2
1 a 1 q
2 b NULL NULL
3 c 3 w
После этого выполнит условие WHERE B.fb2 is NULL и вернет нам только одну строку: "2 b NULL NULL".
Если мы вместо WHERE B.fb2 is NULL подставим WHERE B.fb2 = e то запрос вообще ничего не вернет.
Отредактированно Magz (15.05.2009 12:10:09)
Неактивен
объединённая таблица генерится как временная таблица или как структура в оперативной памяти?
Неактивен

нет ![]()
Выборка обычно производится параллельно из нескольких таблиц без создания таблиц в памяти.
Неактивен
paulus написал:
нет
т.е. все данные хранятся в оперативке?
если выборка происходит параллельно из двух таблиц, то каким образом объединяются результаты?
Неактивен

Точную реализацию можно посмотреть в исходниках ![]()
На пальцах — выбирается одна строка из первой таблицы и соответствующие строки из
второй (и т.д.), потом вторая строка из первой таблицы (и т.д.).
Неактивен
какая-то из таблиц "признаётся" главной и относительно неё построчно составляется результат.
т.е. получается, что параллельно не равно независимо?
а если надо выбрать 5 строк, и есть условие фильтрации наложено на вторую таблицу, то видимо "главной" в запросе окажется вторая таблица?
исходники вещь полезная, но слишком сложная. да и не детали реализации важны, а узловые моменты алгоритма.
Неактивен

Порядок выборки («главная» в Вашей терминологии) показывает EXPLAIN над тем же запросом.
Неактивен