[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: разобраться с LEFT JOIN
S-17
Давным давно сталкивался с LEFT JOIN но честно говоря никогда не понимал его. Ну подставляет он значения слева. Поюзал гугл, но заумные тексты меня только ввели в заблуждение.

Если вам не трудно, объясните пожалуйста, "далекому" и "темному" смысл JOIN а так же разобраться с кодом приведенным ниже.

/////////////SIZES///////////////////
$SIZES=array("ID"=>array(),"PARENT"=>array(),"NAME"=>array()) ;

$query="SELECT a.id as id,a.relation as parent,b.name as size1,c.name as size2 from {$TABLES[15]}
a LEFT JOIN {$TABLES[8]} b ON (b.id=a.relation1) LEFT JOIN {$TABLES[8]} c ON (c.id=a.relation2) WHERE a.parent={$new_item_id}
and a.type='1' order by a.id";
$res=@mysql_query($query);
while ($sizes=@mysql_fetch_array($res))
{
$sizes['name']=$sizes['size1'];
$sizes['name'].=($sizes['size2'])?$sizes['size2']:"";

array_push($SIZES['ID'],$sizes['id']);
array_push($SIZES['PARENT'],$sizes['parent']);
array_push($SIZES['NAME'],$sizes['name']);


Спасибо за понимание!




Спустя 17 минут, 56 секунд (27.06.2012 - 19:08) vital написал(а):
# создаем две таблицы чтоб понять разницу между JOIN
create table table1(
t1_pole int(3)
);
create table table2(
t2_pole int(3)
);

# запалняем таблицы значениями для теста
insert into table1 values(1),(3);
insert into table2 values(1),(2);

# проверяем что вышло в первой таблице
select * from table1;
# t1_pole
# 1
# 3


# проверяем что вышло во второй таблице
select * from table2;
# t2_pole
# 1
# 2
#

# INNER JOIN соединяет таблицы только по тем условиям которые
# указаны в ON и только тогда, когда условие дает положительный результат.
# в ниже указаном запросе условием соединения таблиц является простое сравнение в котором пля ti_pole и t2_pole равны.
# в нашем конкретном случае в обоих таблицах совподает только значение равное 1
select t1_pole,t2_pole
from table1 INNER JOIN table2 ON table1.t1_pole=table2.t2_pole;
# t1_pole t2_pole
# 1 1

# точно такого же результата можно добится также и таким образом как это уже делал ты.
# но это не красивый способ, так как при сложных запросах
# тяжело различить условия соединения таблиц от условий ограничения результата.
select t1_pole,t2_pole
from table1, table2 WHERE table1.t1_pole=table2.t2_pole;
#

# LEFT JOIN
# соединяет тавлицы таким образом, что в любом случае
# будут перечисленны все поля первой таблицы с лева и доплнительно все поля соответствующие условию соединения (JOIN) с права.
# там, где в правой таблице нет значения которое совпадало бы
# с условием соединения в левой таблице будет заполненно NULL

select t1_pole,t2_pole from table1 LEFT JOIN table2 ON table1.t1_pole=table2.t2_pole;
# t1_pole t2_pole
# 1 1
# 3 null

# как видно этот селект выбрал все результаты левой таблицы 1 и 3
# и соответствующее условию значение из правой таблицы
# Так как в правой таблице нет не какого значения которое бы подходило для соединения к значению 3 из левой таблицы,
# то запрос заполнил правое поле ничем т.е null

# Когда это интерессно?
# Пример: У тебя есть таблица с Категориями Товара и есть таблица с Товаром
# предположим, что у тебя есть Категории у которых нет еще Товара,
# но тебе надо показать все Категории(с лева) и пренадлежащии им Торары (с права).
# Обычным INNER JOIN тебе не добится такого результата, так как он
# обрежит все значения с правой и левой таблицы которые не соответствуют условию.
# LEFT JOIN перечислит все категории даже если к ним нет не какого тавара.
# подставив вместо недостающих Товаров NULL
#


# RIGHT JOIN
# Такой же принцип как и в LEFT JOIN, только в зеркальном отображении :)
# T.e. показывает все значения правой таблицы и пресоединяет к ним
# все значения левой таблицы, которые соответствуют условию соединения.
# Там где нет подходящих значений в левой таблице,
# которые соответствуют условию соединения из правой таблицы, стоит NULL

select t1_pole,t2_pole from table1 RIGHT JOIN table2 on table1.t1_pole=table2.t2_pole;
# t1_pole t2_pole
# 1 1
# null 2

#


# менее важно:

# OUTER JOIN
# не когда не встричал , но встречал LFFT OUTER JOIN и RIGHT OUTER JOIN
# которые собственно и являются обычными LEFT и RIGHT джойнами.

# также есть FULL OUTER JOIN который не поддерживается в mysql
# и является LEFT и RIGHT JOIN одновремменно.
#


# CROSS JOIN
# работает в mysql также, как и INNER JOIN хотя по настоящему имеет другое предназначение :)
# CROSS JOIN подставляет для каждого значения левой таблицы все значения правой таблицы и наоборот. т.е.
# такой join можно зделать просто таким образом:
select t1_pole,t2_pole from table1, table2 ;
# t1_pole t2_pole
# 1 1
# 3 1
# 1 2
# 3 2


#

# стераем таблицы
drop tables table1,table2;

Cпасибо SavaFr в свое время за этот пост.

Спустя 1 час, 36 минут, 31 секунда (27.06.2012 - 20:44) l@pteff написал(а):
Здесь неплохая статья о join'ах

Спустя 2 часа, 20 минут, 37 секунд (27.06.2012 - 23:05) S-17 написал(а):
Все встало на свои места, но меня смущают эти условия,я их выделил в коде.
Я просто начал искать по БД значения, чтобы получить в итоге что выводится. И каждый раз начинаю путаться.

$query="SELECT a.id as id,a.relation as parent,b.name as size1,c.name as size2 from {$TABLES[15]}
a LEFT JOIN {$TABLES[8]} b ON (b.id=a.relation1) LEFT JOIN {$TABLES[8]} c ON (c.id=a.relation2) WHERE a.parent={$new_item_id}
and a.type='1' order by a.id";


Спасибо что откликнулись!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.