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, напротив, является симметричной.


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