Выборка пользователей со сложным условием - MySQL
Формулировка задачи:
Задача:
Нужно составить запрос так чтобы выводил всех пользователей сайта кроме тех, что есть в друзьях авторизованного пользователя и эво самого. Есть две таблицы:- Первая user - список пользователей сайта
- Вторая friends - связь двух пользователей которые являются друзьями
- id_сер - id пользователя
- name - имя пользователя
- id_s - id пользователя который отправил запрос на дружбу
- id_f - id пользователя принявший запрос на дружбу
SELECT name,id_s,id_f,id_user
FROM USER LEFT JOIN friends
ON USER.id_user = friends.id_s
WHERE
id_s IS NULL AND id_user NOT IN (SELECT id_f
FROM friends
WHERE
id_s = $user_id)
AND id_user NOT IN (SELECT id_s
FROM friends
WHERE
id_f = $user_id)
UNION
SELECT name,id_s,id_f,id_user
FROM USER LEFT JOIN friends
ON USER.id_user = friends.id_s
WHERE id_s != $user_id AND id_f != $user_idРешение задачи: «Выборка пользователей со сложным условием»
textual
Листинг программы
SELECT name,id_user FROM USER WHERE id_user NOT IN( SELECT id_s FROM friends WHERE id_f=$user_id UNION ALL SELECT id_f FROM friends WHERE id_s=$user_id UNION ALL SELECT $user_id)
Объяснение кода листинга программы
В представленном коде выполняется выборка из таблицы USER полей name и id_user с условием, что id_user не входит в список id_s из таблицы friends, где id_f равен переменной $user_id. Также в список исключений добавляются сами значения id_f из таблицы friends.
- SELECT name,id_user FROM USER - выборка полей
nameиid_userиз таблицыUSER - WHERE id_user NOT IN( - условие, что
id_userне входит в списокid_s - SELECT id_s FROM friends - выборка поля
id_sиз таблицыfriends - WHERE id_f=$user_id - условие, что
id_fравно переменной$user_id - UNION ALL - объединение результатов предыдущих запросов
- SELECT $user_id - выборка значения переменной
$user_idСписок исключений формируется в целях предотвращения выборки пользователей, которые являются друзьями пользователя с указанным id.