Блог старого компьютера

Блог старого компьютера


Главная Разное Объединяем mysql запросы с помощью JOIN

Объединяем mysql запросы с помощью JOIN

08.05.2013 06:30 Администратор Разное
Печать PDF

При разработке кода очень часто необходимо достать информацию из разных таблиц баз данных. Казалось бы ничего сложного в этом нету делаем запрос сначала в одну таблицу базы данных, получаем например id пользователя который создал материал, далее нам необходимо сделать запрос в другую базу данных (в базу данных в которой хранится информация о пользователе) по только что полученному id чтоб получить имя пользователя который создал этот материал. Все бы хорошо, но в данном случае выходит что надо 2 раза обращаться к базе данных, а это при высокой посещаемости создаст лишнюю нагрузку на сервер, да и увеличивает сам код. Что же делать? Для решения поставленной задчи служит специальный оператор языка SQL JOIN.

 Официальное трактование звучит так "JOIN — оператор языка SQL, который является реализацией операции соединения реляционной алгебры". Звучит довольно грозно, но на самом деле если разобраться то ничего сложного в нем нету.

Перейдем к практике и рассмотрим следующую ситуацию:

Нам необходимо получить из mysql базы данных информацию о материале, в информации о материале есть id категории к которой он относится, так же необходимо получить название это самой категории. Для этого необходимо объединить два запроса с помощью join.

Так как под рукой у меня находится joomla то и примеры будем делать на ее mysql базе. Для правильного составления запроса рассмотрим структуру таблиц баз данных с которыми нам необходимо будет работать.

Ячейки таблицы с материалами (#__content):

id
title
alias
title_alias
introtext
fulltext
state
sectionid
mask
catid
created
created_by
created_by_alias
modified
modified_by
checked_out
checked_out_time
publish_up
publish_down
images
urls
attribs
version
parentid
ordering
metakey
metadesc
access
hits
metadata

 Для начала составим простой запрос в базу данных который вернет нам необходимые данные, выглядеть он будет так:

SELECT id, title, catid, created_by FROM #__content WHERE id='4'

В результате выполнения этого запроса мы получим массив со следующими данными:

[id] => 4
[title] => Меню для гостей
[catid] => 1
[created_by] => 162

 Сейчас необходимо доработать запрос чтоб он по значению ячейки catid получил данные (название категории) еще и  из таблицы #__categories.

Ячейки таблицы с информацией о категории (#__categories):

id  
parent_id
title
name
alias
image
section
image_position
description
published
checked_out
checked_out_time
editor
ordering
access
count
params

 Запрос сейчас у нас будет выглядеть так:

SELECT #__content.id, #__content.title, #__content.catid, #__content.created_by,
#__categories.title
FROM #__content JOIN #__categories ON #__content.catid=#__categories.id
WHERE #__content.id='4'

Как видите в данном запросе мы прописываем конкретно из какой базы доставать ячеку #__content.id, так как в запросе мы работаем с двумя таблицами. Так же в данном запросе мы видим оператор ON он служит для указания условия. То есть грубо говоря можно сказать так "Где #__content.catid равняется  #__categories.id"

При выполнении запроса выше мы получим массив со следующими данными:

[id] => 4
[title] => Название категории
[catid] => 1
[created_by] => 162

Для правильной работы запрос представленый выше необходимо доработать, так как в обоих таблицх существует ячейка title и она просто перезаписывается, думаю вы уже это заметили. Для правильной работы нам необходимо переопределить название ячейки в массиве на выходе. При этом sql запрос будет выглядеть так:

SELECT #__content.id, #__content.title, #__content.catid, #__content.created_by,
#__categories.title as ctitle
FROM #__content JOIN #__categories ON #__content.catid=#__categories.id
WHERE #__content.id='4'

 А данные на выходе будет такими:

[id] => 4
[title] => Меню для гостей
[catid] => 1
[created_by] => 162
[ctitle] => Название категории

 Вот таким образом мы вместо формирования 2 запросов сделали все действия в одном. Но не будем останавливаться на достигнутом и сделаем еще одно объединение с помощью которого получим еще и имя пользователя который создал материал. Информация о пользователях у нас хранится в таблице #__users. Эта таблица содержит в себе следующие ячейки:

id
name
username
email
password
usertype
block
sendEmail
gid
registerDate
lastvisitDate
activation
params

 И так составляем запрос, в данном случае нам нужно будет использовать не просто JOIN, а LEFT JOIN (при первом объединении используется JOIN, а в следующих LEFT JOIN). Mysql запрос тройного объединения будет выглядеть так:

SELECT #__content.id, #__content.title, #__content.catid, #__content.created_by,
#__categories.title as ctitle,
#__users.name
FROM #__content JOIN #__categories ON #__content.catid=#__categories.id
LEFT JOIN #__users ON #__content.created_by=#__users.id
WHERE #__content.id='4'

 А на выходе мы получим массив со следующими данными;

[id] => 4
[title] => Меню для гостей
[catid] => 1
[created_by] => 162
[ctitle] => Название категории
[name] => Administrator

 Тем самым в одном запросе мы вывели данные из 3 mysql таблиц и это не предел, если есть необходимость то mysql запрос можно еще увеличить. Думаю особо поянсть последний пример не стоит, все можно освоить на этом примере методом проб и ошибок. Если у вас возникунт проблеммы в формировании mysql запросов которые должны объединить данные из нескольких таблиц то прошу в комментарии.

P.S. - Для тех кто не знаком с joomla или тот кто просто не понимает что значит "#__" отвечу, это символы которые при обработке запроса в joomla заменяются на указанный префикс в настройка, по умолчания в joomla 1.5 это префикс sdf345e5_.

Добавить комментарий


Защитный код
Обновить

Поиск

Голосование

Что Вы думаете на счет битрикса?
 

Все материалы раздела