SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.05.2009 12:15:42

axe
Участник
Зарегистрирован: 04.05.2009
Сообщений: 7

реализация связей между таблицами

Код:

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 ?

Неактивен

 

#2 04.05.2009 17:27:44

Magz
Гуру
Откуда: Москва
Зарегистрирован: 18.09.2007
Сообщений: 112

Re: реализация связей между таблицами

Никак. В результирующей выборке у вас последовательно будут идти поля из table_nm1 и из table_nm2. Если при объединении соответствия не задано, то будет выведена данная строка из таблицы table_nm1, а поля таблицы table_nm2 будут заполнены значением NULL.
Если Вам такие строчки не нужны, то используйте INNER JOIN (или просто JOIN) вместо LEFT JOIN.

Неактивен

 

#3 04.05.2009 21:54:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: реализация связей между таблицами

Если я правильно понял, то вопрос был о механизме поиска. Если да — то механизм простой:
Берется каждая строка из nm1 и ищется соответствующая строка в nm2. Если она не найдена,
то она попадает в выборку.

Разумеется, индексы используются. На nm2.

Неактивен

 

#4 07.05.2009 10:08:18

axe
Участник
Зарегистрирован: 04.05.2009
Сообщений: 7

Re: реализация связей между таблицами

да, вопрос по механизму поиска.

строки, которых нет, могут и не удовлетворять условию:

Код:

where table_nm2.pk=12;

откуда MySQL знает, что надо искать все строки из nm1, для которых нет соотвествия в nm2?

возможно, сначала берётся пустая строка nm2 и проверяется, удовлетворяет ли она условиям фильтра, если удовлетворяет, то надо искать строки nm1, если не удовлетворяет, то не надо. как думаете?

Неактивен

 

#5 07.05.2009 13:51:06

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: реализация связей между таблицами

Честно говоря, не понимаю, откуда взялось магическое «12» smile
Напишите, пожалуйста, полный запрос — тогда, скорее всего, получите полный ответ smile

P.S. Разумно дополнить я ничего не могу, т.к. множества table_nm2.pk=12 и table_nm2.pk is null не пересекаются.

Неактивен

 

#6 15.05.2009 11:19:01

axe
Участник
Зарегистрирован: 04.05.2009
Сообщений: 7

Re: реализация связей между таблицами

Код:

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?

Неактивен

 

#7 15.05.2009 12:07:30

Magz
Гуру
Откуда: Москва
Зарегистрирован: 18.09.2007
Сообщений: 112

Re: реализация связей между таблицами

Попробую на примере объяснить, как работает 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)

Неактивен

 

#8 19.05.2009 17:28:52

axe
Участник
Зарегистрирован: 04.05.2009
Сообщений: 7

Re: реализация связей между таблицами

объединённая таблица генерится как временная таблица или как структура в оперативной памяти?

Неактивен

 

#9 19.05.2009 21:46:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: реализация связей между таблицами

нет smile

Выборка обычно производится параллельно из нескольких таблиц без создания таблиц в памяти.

Неактивен

 

#10 20.05.2009 12:16:54

axe
Участник
Зарегистрирован: 04.05.2009
Сообщений: 7

Re: реализация связей между таблицами

paulus написал:

нет smile

т.е. все данные хранятся в оперативке?

если выборка происходит параллельно из двух таблиц, то каким образом объединяются результаты?

Неактивен

 

#11 20.05.2009 14:10:59

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: реализация связей между таблицами

Точную реализацию можно посмотреть в исходниках wink

На пальцах — выбирается одна строка из первой таблицы и соответствующие строки из
второй (и т.д.), потом вторая строка из первой таблицы (и т.д.).

Неактивен

 

#12 21.05.2009 13:37:46

axe
Участник
Зарегистрирован: 04.05.2009
Сообщений: 7

Re: реализация связей между таблицами

какая-то из таблиц "признаётся" главной и относительно неё построчно составляется результат.
т.е. получается, что параллельно не равно независимо?

а если надо выбрать 5 строк, и есть условие фильтрации наложено на вторую таблицу, то видимо "главной" в запросе окажется вторая таблица?

исходники вещь полезная, но слишком сложная. да и не детали реализации важны, а узловые моменты алгоритма.

Неактивен

 

#13 21.05.2009 16:35:09

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: реализация связей между таблицами

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson