13.07.2012, 21:57
|
Профессор
|
|
Регистрация: 19.03.2012
Сообщений: 163
|
|
Работа с 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. Заранее благодарю.
|
|
13.07.2012, 22:10
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от kilogram
|
Код:
|
select * from name1 left join name1 on name1.name=name2.name |
|
Вы случайно не ошиблись в запросе?
Код:
|
select * from name1 left join name2 on name1.name=name2.name |
|
|
13.07.2012, 22:58
|
Профессор
|
|
Регистрация: 19.03.2012
Сообщений: 163
|
|
Попробовал алиасы использовать ,прочитал про них, с ними почему то не работает.
Код:
|
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; |
Результат выдает один и тот же
|
|
13.07.2012, 23:43
|
Профессор
|
|
Регистрация: 19.03.2012
Сообщений: 163
|
|
left join должен искать все строки в таблице name1 с величиной name, которая не присутствует в таблице name2, но в name2 присутствует Петя, почему оно все равно его выводит при этом запросе ниже?
Код:
|
select name1.name from name1 left join name2 on name1.name=name2.name |
|
|
13.07.2012, 23:55
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от kilogram
|
left join должен искать все строки в таблице name1 с величиной name, которая не присутствует в таблице name2, но в name2 присутствует Петя, почему оно все равно его выводит при этом запросе ниже?
|
Вы же написали name1.name =name2.name, значит наоборот, все строки в таблице name1 с величиной name, которая присутствует в таблице name2.
|
|
13.07.2012, 23:59
|
Профессор
|
|
Регистрация: 19.03.2012
Сообщений: 163
|
|
Там http://ru.wikipedia.org/wiki/Join_(SQL) написано такое:
Цитата:
|
LEFT OUTER JOIN
К левой таблице присоединяются все записи из правой, соответствующие условию (по правилам inner join), плюс все не вошедшие записи из левой таблицы, поля правой таблицы заполняются значениями NULL.
|
А как знать где левая таблица, а где правая?
|
|
14.07.2012, 00:10
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Левая таблица, это та, которая указывается слева слов LEFT JOIN, правая - соответственно справа.
|
|
14.07.2012, 00:21
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от 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 выведутся по одному разу.
|
|
14.07.2012, 00:24
|
Профессор
|
|
Регистрация: 19.03.2012
Сообщений: 163
|
|
Перед джоином обязательно должна стоять таблица которая ссылается, а после джоина таблица на которую ссылаются?
|
|
14.07.2012, 00:37
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от kilogram
|
Перед джоином обязательно должна стоять таблица которая ссылается, а после джоина таблица на которую ссылаются?
|
Я не совсем понял, что означает, что одна таблица ссылается на другую, но отвечу так: операция LEFT JOIN является ассиметричной, поэтому переставлять таблицы нельзя. Операция INNER JOIN, напротив, является симметричной.
|
|
|
|