• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Помогите реализовать запрос по двум таблицам

  • Автор темы AlexBHT
  • Дата начала
A

AlexBHT

Задача такая: составить запрос, для выборки блогов из таблицы `blogs`, в которой имеется столбец `access`, значения которого обозначают следующее:
0 - блог доступен для всех
1 - блог доступен для всех пользователей
2 - блог доступен для всех друзей автора блога
3 - блог недоступен

Далее, имеется таблица `friends`, для определения по которой является ли пользователь другом другого пользователя используется такое условие:
/*например ID нашего аккаунта = 100, а ID аккаунта с которым нужно свериться = 200*/
((`friends`.`user`=200 AND `friends`.`friend`=100) OR (`friends`.`friend`=200 AND `friends`.`user`=100)) AND `friends`.`accepted`=1

Пояснение:
В таблице `friends` имеются столбцы `user` и `friend` в которых и находятся ID пользователей между которыми состоит дружба. Также, столбец `accepted` обозначает что дружба активна.

Я не силён в выборке из нескольких таблиц, т.к. не приходилось сталкиваться с этим, и не ознакомлен с должным функционалом MySQL для этой задачи. Исходя из этого я составил следующий запрос:
SELECT `blogs`.* FROM `blogs`,`friends` WHERE `blogs`.`access`<=1 OR (`blogs`.`access`=2 AND (((`friends`.`user`=`blogs`.`user` AND `friends`.`friend`=100) OR (`friends`.`friend`=`blogs`.`user` AND `friends`.`user`=100)) AND `friends`.`accepted`=1))

Запрос ориентирован на авторизованного пользователя, для гостей используется отдельный, с простой выборкой по `access`=0. Также, запрос выбирает среди всех блогов доступные для чтения именно нам (ID = 100)

Всё работает как нужно, но. Если в таблице `friends` имеется например 10 записей, то запрос делает выборку 10-ти одинаковых строк из таблицы `blogs`. Я понимаю, что по таблице идёт цикл и т.д, но незнаю как избавиться от такой проблемы.
В общем то цель вопроса какая: yзнать, как можно производить выборку из одной таблицы, сверяясь в некоторых условиях по второй. Т.к. по друзьям выборка идёт только при `access`=2, а в остальных случаях таблица `friends` не задействуется.
Если кто может, помогите пожалуйста, также можно предложить более скоростной вариант запроса. Заранее спасибо :)
 
A

Aleksey

Ну чтобы не парится (то есть это не лучшее, но самое простое решение :) ), добавь после SELECT такое волшебное слово DISTINCT:

SELECT DISTINCT `blogs`.* FROM .....
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!