Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Работа с left join (https://javascript.ru/forum/server/29849-rabota-s-left-join.html)

kilogram 13.07.2012 21:57

Работа с left join
 
Есть 2 таблицы: name1 и name2;
name1 создана так:

Код:

create table name1(id int(3) auto_increment, name varchar(10), primary key(id))

name2 создана так:

Код:

create table name2(id int(3) auto_increment, name varchar(10), primary key(id),foreign key(name) references name1)

Вот так заполнены таблицы:



Ввожу такой запрос, не работает.

Код:

select * from name1 left join name1 on name1.name=name2.name

Только начинаю изучать эти джоины, читаю здесь по примеру похожему, что-то не срабатывает: http://www.mysql.ru/docs/man/JOIN.html

Если можно покажите на моих банальных таблицах работу join. Заранее благодарю.

oneguy 13.07.2012 22:10

Цитата:

Сообщение от kilogram
Код:

select * from name1 left join name1 on name1.name=name2.name

Вы случайно не ошиблись в запросе? :)
Код:

select * from name1 left join name2 on name1.name=name2.name

kilogram 13.07.2012 22:58

Попробовал алиасы использовать ,прочитал про них, с ними почему то не работает.

Код:

select * from name1 as n1, name2 as n2, left join n2 on n2.name=n1.name
Скажите, чем отличается это:
Код:

select * from name1 left join name2 on  name1.name=name2.name;
от этого?

Код:

select * from name1 left outer join name2 on  name1.name=name2.name;
Результат выдает один и тот же

kilogram 13.07.2012 23:43

left join должен искать все строки в таблице name1 с величиной name, которая не присутствует в таблице name2, но в name2 присутствует Петя, почему оно все равно его выводит при этом запросе ниже?

Код:

select name1.name from name1 left join name2 on  name1.name=name2.name

oneguy 13.07.2012 23:55

Цитата:

Сообщение от kilogram
left join должен искать все строки в таблице name1 с величиной name, которая не присутствует в таблице name2, но в name2 присутствует Петя, почему оно все равно его выводит при этом запросе ниже?

Вы же написали name1.name=name2.name, значит наоборот, все строки в таблице name1 с величиной name, которая присутствует в таблице name2.

kilogram 13.07.2012 23:59

Там http://ru.wikipedia.org/wiki/Join_(SQL) написано такое:
Цитата:

LEFT OUTER JOIN

К левой таблице присоединяются все записи из правой, соответствующие условию (по правилам inner join), плюс все не вошедшие записи из левой таблицы, поля правой таблицы заполняются значениями NULL.
А как знать где левая таблица, а где правая?

oneguy 14.07.2012 00:10

Левая таблица, это та, которая указывается слева слов LEFT JOIN, правая - соответственно справа.

oneguy 14.07.2012 00:21

Цитата:

Сообщение от kilogram
select name1.name from name1 left join name2 on name1.name=name2.name

Цитата:

Сообщение от oneguy
Вы же написали name1.name=name2.name, значит наоборот, все строки в таблице name1 с величиной name, которая присутствует в таблице name2.

Извините, я ошибся. Если все значения name2.name уникальны, то все значения name1.name выведутся по одному разу.

kilogram 14.07.2012 00:24

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

oneguy 14.07.2012 00:37

Цитата:

Сообщение от kilogram
Перед джоином обязательно должна стоять таблица которая ссылается, а после джоина таблица на которую ссылаются?

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

kilogram 14.07.2012 00:58

Вот написал запрос:
Код:

select *from name1 right join name2 on  name1.name=name2.name where name1.name is not NULL
К таблице, имя которой стоит перед джойном - name1,
присоединяется таблица, имя которой идет после джойна - name2
Далее стоит условие, согласно которому выводить. Условие такое:

Выводить, все строки из таблицы name1 с полем name, которые не присутствуют в таблице name2.

У меня такие записи в таблице name2, добавил 2 записи:


Почему в результате выводит?
Код:

1  Петя  1 Петя

oneguy 14.07.2012 01:11

Остальные строчки отсекаются этим:
Код:

where name1.name is not NULL

Маэстро 24.07.2012 19:07

Цитата:

Сообщение от kilogram (Сообщение 188627)
А как знать где левая таблица, а где правая?

:lol: Вы уж простите, но смеялся до слёз!
Если коротко, то левая таблица - слева от JOIN, а правая - справа.

Вообще у Вас неудачный пример для изучения, т.к. "вязать" таблицы по текстовым полям - это оочень плохо. Обычно таблицы связываются по числовым полям (ID). Попробуйте разобраться с присоединением к таблице Заказов текстовоых полей из таблицы (справочника) Товаров.
Первая таблица содержит поля ID и TovarID. Вторая - ID и Name.
Чтобы показать список заказов из первой таблицы, причем названия товаров вытащить из второй SQL-запрос будет выглядеть так:

select name1.ID, name2.name from name1 left join name2 ON name1.tovarID=name2.ID


Часовой пояс GMT +3, время: 13:24.