Задавайте вопросы, мы ответим
Вы не зашли.
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 над тем же запросом.
Неактивен