Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: JOIN

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: А поподробнее? :)
Стас
Отправлено: 11 Сентября, 2007 - 18:14:39
Post Id


Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007  


Помог: 0 раз(а)

[+]


Объясните, что делает этот оператор, чем отличается LEFT JOIN, RIGHT JOIN и т.п.

А то здесь я вижу только синтаксис и примерыУлыбка


Целый час пытался составить нужный запрос, не получалось. Получилось с LEFT JOIN, хотя я так и не понял что именно он делаетУлыбка
 
 Top
valenok
Отправлено: 11 Сентября, 2007 - 18:46:09
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Конечно респект ARTY за столь хороший сайт,
за то что перевёл с Английского документацию по нескольким функциям,
собрал полезную информацию по php на одном сайте
Но обращаться куда лучше к официальным документациям.

На этот раз стоило обратиться к офф. документации по причине удобного построения самой документации
mysql.ru

В поиске по документации пишем: JOIN
попадаем на http://www[dot]mysql[dot]ru/docs/man/JOIN[dot]html
Читаем, ничего не понимаем, но видим что это подкатегория
6.4.1 Синтаксис оператора SELECT
Что и идём читать
(Там помогает Ctrl+F)

Цитата:

Выражение FROM table_references задает таблицы, из которых надлежит извлекать строки. Если указано имя более чем одной таблицы, следует выполнить объединение. Информацию о синтаксисе объединения можно найти в разделе section 6.4.1.1 Синтаксис оператора JOIN. Для каждой заданной таблицы по желанию можно указать псевдоним.

Цитата:
При указании параметра STRAIGHT_JOIN оптимизатор будет объединять таблицы в том порядке, в котором они перечислены в выражении FROM. Применение данного параметра позволяет увеличить скорость выполнения запроса, если оптимизатор производит объединение таблиц неоптимальным образом.


Что касается JOIN всех сторон света
Цитата:
Операции LEFT JOIN и RIGHT JOIN
Объединяют записи исходных таблиц при использовании в любом предложении FROM.


Цитата:
По возможности минимально используйте LEFT JOIN для объединения таблиц. Это весьма трудоёмкая операция для базы данных.


Более понятное объяснение left Join
http://physics[dot]grsu[dot]by/db/doc/sql/sql1/join[dot]html


Вообщем то что я хотел сказать, раз уж пошли смотреть документацию, то посмотрите хотябы два три ресурса.


-----
Truly yours, Sasha.
 
My status
 Top
Стас
Отправлено: 11 Сентября, 2007 - 19:28:38
Post Id


Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007  


Помог: 0 раз(а)

[+]


Спасибо Улыбка
 
 Top
evgenijj
Отправлено: 11 Сентября, 2007 - 20:31:40
Post Id



Участник


Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006  
Откуда: Москва


Помог: 10 раз(а)




Это ты интересную тему затронул - объединения таблиц. Это таблицы БД из классической книги Грабера (она где-то есть на сайте http://php.su)
PHP:
скопировать код в буфер обмена
  1.  
  2. Таблица 1.4 Salespeople (Продавцы)
  3.  
  4.       ----------------------------------------------
  5.         SNUM  |   SNAME   |  CITY        |   COMM
  6.       --------|-----------|--------------|----------
  7.         1001  |  Peel     |  London      |    .12
  8.         1002  |  Serres   |  San Jose    |    .13
  9.         1004  |  Motika   |  London      |    .11
  10.         1007  |  Rifkin   |  Barcelona   |    .15
  11.         1003  |  Axelrod  |  New York    |    .10
  12.       ----------------------------------------------
  13.  
  14.  
  15. Таблица 1.5 Customers (Покупатели)
  16.  
  17.        ----------------------------------------------
  18.         CNUM  |  CNAME     | CITY    | RATING | SNUM
  19.        -------|------------|---------|--------|------
  20.         2001  |  Hoffman   | London  |   100  | 1001
  21.         2002  |  Giovanni  | Rome    |   200  | 1003
  22.         2003  |  Liu       | SanJose |   200  | 1002
  23.         2004  |  Grass     | Berlin  |   300  | 1002
  24.         2006  |  Clemens   | London  |   100  | 1001
  25.         2008  |  Cisneros  | SanJose |   300  | 1007
  26.         2007  |  Pereira   | Rome    |   100  | 1004
  27.        ----------------------------------------------
  28.  
  29. Таблица 1.6 Orders (Заказы)
  30.  
  31.        -----------------------------------------------
  32.         ONUM  |    AMT    |    ODATE    | CNUM | SNUM
  33.        -------|-----------|-------------|------|------
  34.         3001  |    18.69  |  10/03/1990 | 2008 | 1007
  35.         3003  |   767.19  |  10/03/1990 | 2001 | 1001
  36.         3002  |  1900.10  |  10/03/1990 | 2007 | 1004
  37.         3005  |  5160.45  |  10/03/1990 | 2003 | 1002
  38.         3006  |  1098.16  |  10/03/1990 | 2008 | 1007
  39.         3009  |  1713.23  |  10/04/1990 | 2002 | 1003
  40.         3007  |    75.75  |  10/04/1990 | 2004 | 1002
  41.         3008  |  4723.00  |  10/05/1990 | 2006 | 1001
  42.         3010  |  1309.95  |  10/06/1990 | 2004 | 1002
  43.         3011  |  9891.88  |  10/06/1990 | 2006 | 1001
  44.        -----------------------------------------------
  45.  

Пусть, нам надо выбрать заказы всех продавцов с указанием уникального идентификатора продавца, его имени, суммы заказа и даты заказа (т.е. данные мы должны брать из двух таблиц)
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT a.snum, a.sname, b.amt, b.odate
  3. FROM Salespeople a, Orders b
  4. WHERE a.snum=b.snum
  5.  

Это устаревший синтаксис. Лучше так
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT a.snum, a.sname, b.amt, b.odate
  3. FROM Salespeople a INNER JOIN Orders b
  4. ON a.snum=b.snum
  5.  

А можно еще и так
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT a.snum, a.sname, b.amt, b.odate
  3. FROM Salespeople a INNER JOIN Orders b
  4. USING (snum)
  5.  

(про NATURAL JOIN я не буду рассказывать, дабы не смутить тебя окончательно).
Это внутреннее объединение таблиц. Если мы не будем использовать условие (WHERE, ON, USING), то получим так называемое "декартово произведение" - это когда каждая строка первой таблицы соединяется с каждой строкой второй таблицы.

А теперь - внешние объединения. Они бывают трех видов
* LEFT OUTER JOIN
* RIGHT OUTER JOIN
* FULL OUTER JOIN

Пусть нам нужно получить имена всех клиентов (покупателей), и заказы, которые они сделали. Причем, в результат нужно включить и тех клиентов, которые еще не сделали ни одного заказа (в наше БД их нет, но вообще, они могут быть):
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT a.cnum, a.cname, b.amt, b.odate
  3. Customers a LEFT OUTER JOIN Orders b
  4. ON a.cnum=b.cnum
  5.  


В отличие от внутренних объединений, внешние объединения включают в результат также строки, не имеющие связанных с ними строк.

Про RIGHT OUTER JOIN рассказывать не буду - т.к. это, практически, не отличается от LEFT OUTER JOIN.

Полное внешнее объединение (FULL OUTER JOIN) извлекает все строки из обеих таблиц и связывает между собой те, которые могут быть связаны. В отличие от левого внешнего и правого внешнего объединений, которые включают в результат несвязанные строки только из одной таблицы, полное внешнее объединение включает в результат несвязанные строки из обеих таблиц.
 
 Top
Стас
Отправлено: 12 Сентября, 2007 - 13:06:37
Post Id


Частый гость


Покинул форум
Сообщений всего: 147
Дата рег-ции: Май 2007  


Помог: 0 раз(а)

[+]


Вроде понятно Улыбка


Что-то захотелось рассказать, зачем мне пригодился JOINУлыбка

Вообщем, это я ворочию простой мод портала под phpBB 3Улыбка

Есть таблица с категориями - поля id, catname и order - для сортировки.
Есть таблица с постами - интересует только поле cat_id.
Мне нужно было получить имя, id и число постов в категории, причём я не хотел составлять лишние запросыУлыбка
Сначала пробовал с WHERE - почти получилось, но если в категории нет постов, она не была в результатах.

А получилось так (PORTAL_POSTS_TABLE и PORTAL_CATS_TABLE содержат имена таблиц):
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = $db->sql_query("SELECT count(p.post_id) AS postcnt, c.*
  3. FROM ".PORTAL_CATS_TABLE." c LEFT JOIN ".PORTAL_POSTS_TABLE." AS p ON c.id=p.cat_id
  4. GROUP BY c.id ORDER BY c.order");

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB