flapflapjack
@flapflapjack
на треть я прав

Правильно ли я делаю INNER JOIN?

Доброго утра.

Есть таблицы в БД (в скобках пример записи):

premissions :				        id	name //(1,"page_edit")
group_premissions: 			        id	group_id	premission_id //(1,1)
user_groups:				        id	group_name //(1,"Редакторы")
users:						id	group_id //(1,1)

premissions - привелегии
user_groups - список групп
users - юзеры
group_premissions - связь группы, и выданных ей привелегий

Нужен запрос, вытаскивающий привилегии пользователя в массив привилегий, который потом перед загрузкой страницы тупо проверяется
if(in_array("page_edit"),$user->get_access()) { грузи страницу } else {die("Вам низя тут быть!");}

Я составил вот такой запрос:
SELECT
premissions.name,
group_premissions.group_id,
group_premissions.premission_id,
users.id as userid,
user_groups.group_name
from group_premissions
inner join premissions on group_premissions.premission_id=premissions.id 
inner join user_groups on user_groups.id=group_premissions.group_id 
inner JOIN users on users.group_id=user_groups.id 
WHERE users.id='1'


Все отлично работает. Но вдруг появился вопрос - а правильно ли я использую INNER JOIN? может нужно использовать LEFT или RIGHT JOIN? я вообще никогда в жизни ничего кроме INNER JOIN не использовал. А на первых шагах вообще писал так:

SELECT A.value1, A.value2, B.value1, B.value2 FROM A,B where A.value1=1 AND A.value2=B.value1


Я читал про перекрытия запросов LEFT и RIGHT JOIN и как там они "коньюнктируют и дезъюнктируют" результаты, но я так и не понял до конца - где такие объединения могут понадобиться, зачем, и правильно ли я использую INNER?

Ну или как? Работает - не трогай? =)) Откройте мне глаза дабы я мог снять с себя шапочку из фольги.
  • Вопрос задан
  • 65 просмотров
Решения вопроса 1
@abroabr
На деле это проще, чем выглядит.

Внутренее соединение - это самое обычное соединение таблиц. Даже нет необходимости указывать, что это inner join, если и более простой синтаксис - это будет все равно внутреннее соединение.

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

Внешнее соединение обозначает, что помимо того, что вам выдало бы внутренее соединение вы дополнительно плюсом получите данные из первой (left join) или второй (right join) таблицы. Даже если в другой таблице и не было записей, соответствующих условию соединения.

Зачем может быть нужно внешнее соединение? Например, у вас есть пользователи, которые не входят ни в одну группу. Построив внешнее левое соединение по таблице пользователи и по таблице группы - вы получите полный список пользователей. Те из них, что не входят ни в одну группу - тоже будут присутствовать в списке, но в колонках описывающих группы будет указано NULL.

Если же вы построите ровно такой же запрос по внутреннему (обычному) соединению, то есть соедините пользователей и группы - то получите только тех, кто входит хоть в какую-то группу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы