LEFT (RIGHT) JOIN and INNER JOIN?

Cruiser

Новичок
LEFT (RIGHT) JOIN and INNER JOIN?

1. Чем отличаются сабжи? Что быстрее работает?
И чем отличаются от простой связи table1.pole = table2.pole?

2. Я выбираю данные из нескольких таблиц по примеру "SELECT * FROM table1, table2, ... WHERE table1.pole = table2.pole"в массив $row=mysql_fetch_array(). Как обращаться к отдельным полям массива $row? $row['table.pole'] не получается.
 

lucas

Guest
Чем отличаются сабжи? Что быстрее работает?
И чем отличаются от простой связи table1.pole = table2.pole?
http://dev.mysql.com/doc/mysql/ru/JOIN.html
"Простая связь" называется декартовым произведением.

Как обращаться к отдельным полям массива $row?
Давать им разные превдонимы в запросе:
Код:
SELECT t1.foo AS [b]foo1[/b], t2.foo AS [b]foo2[/b]
FROM t1, t2...
 

Groove

Новичок
Re: LEFT (RIGHT) JOIN and INNER JOIN?

Автор оригинала: Cruiser
1. Чем отличаются сабжи? Что быстрее работает?
И чем отличаются от простой связи table1.pole = table2.pole?

2. Я выбираю данные из нескольких таблиц по примеру "SELECT * FROM table1, table2, ... WHERE table1.pole = table2.pole"в массив $row=mysql_fetch_array(). Как обращаться к отдельным полям массива $row? $row['table.pole'] не получается.
По поводу различных вариантов JOIN-ов... может быть это поможет тебе понять:
PHP:
#
# Table structure for table 'a'
#

CREATE TABLE /*!32300 IF NOT EXISTS*/ a (
  a_id int(4) unsigned NOT NULL auto_increment,
  a_name varchar(32) ,
  PRIMARY KEY (a_id),
  INDEX a_id (a_id)
);



#
# Dumping data for table 'a'
#
INSERT INTO a VALUES("1","Категория 1");
INSERT INTO a VALUES("2","Категория 2");
INSERT INTO a VALUES("3","Категория 3");


#
# Table structure for table 'b'
#

CREATE TABLE /*!32300 IF NOT EXISTS*/ b (
  b_id int(4) unsigned NOT NULL auto_increment,
  a_id int(4) unsigned ,
  b_name varchar(32) ,
  PRIMARY KEY (b_id),
  INDEX b_id (b_id)
);



#
# Dumping data for table 'b'
#
INSERT INTO b VALUES("1","1","Товар 1");
INSERT INTO b VALUES("2","2","Товар 2");
INSERT INTO b VALUES("3","4","Товар 3");
Ну, а теперь делаем запросы:

PHP:
select a.a_id, a.a_name, b.b_id,b.b_name from a inner join b on a.a_id=b.a_id
или как частный случай соединения inner join - твой вариант
PHP:
select a.a_id, a.a_name, b.b_id,b.b_name from a, b where a.a_id=b.a_id
Результат запроса (жесткое связывание двух таблиц):
PHP:
1,Категория 1,1,Товар 1
2,Категория 2,2,Товар 2

PHP:
select a.a_id, a.a_name, b.b_id,b.b_name from a left join b on a.a_id=b.a_id
Результат запроса (выводятся ВСЕ записи из ЛЕВОЙ таблицы и, если есть, связанные условием a.a_id=b.a_id записи из правой таблицы):
PHP:
1,Категория 1,1,Товар 1
2,Категория 2,2,Товар 2
3,Категория 3,NULL,NULL

PHP:
select a.a_id, a.a_name, b.b_id,b.b_name from a right join b on a.a_id=b.a_id
Результат запроса (выводятся ВСЕ записи из ПРАВОЙ таблицы и, если есть, связанные условием a.a_id=b.a_id записи из левой таблицы):
PHP:
1,Категория 1,1,Товар 1
2,Категория 2,2,Товар 2
NULL,NULL,3,Товар 3
P.S.: лично я так разбирался с JOIN-ами, а вообще конечно - обратись к документации

-------------
Пока писал ответ, тебе уже ответил lucas...
Ну, да, и конечно надо использовать псевдонимы для полей с одинаковыми именами в разных таблицах которые учавствуют в запросе и выводятся в результате...
PHP:
select a.a_id, a.a_name, b.a_id as THIS_IS_PSEVDONIM_a_id, b.b_id,b.b_name from a left join b on a.a_id=b.a_id
 

Cruiser

Новичок
Хмм, по join вроде уяснил.
А вот по полям из массива... я где то читал про выборку odbc функциями так вот там есть формат обращения к полям из разных таблиц прямо в массиве, я думал что и для мускуля такое есть.
 
Сверху