Выборка пользователей со сложным условием - MySQL

Узнай цену своей работы

Формулировка задачи:

Задача:

Нужно составить запрос так чтобы выводил всех пользователей сайта кроме тех, что есть в друзьях авторизованного пользователя и эво самого. Есть две таблицы:
  1. Первая user - список пользователей сайта
  2. Вторая friends - связь двух пользователей которые являются друзьями
Таблица user имеет колонки:
  • id_сер - id пользователя
  • name - имя пользователя
Таблица friends имеет колонки:
  • 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
$user_id - id авторизованного пользователя Проблемы которые возникли: 1. Одни и те же пользователи выводятся несколько раз 2. Если пользователь не имеет еще друзей то в списке выводится и он (Знаю как решить). Вопрос: 1. Можно составить запрос более производительним? Если да, то как? 2. Если логика запроса правильная то как решить Вышеперечисленные проблемы? Приоритеты: 1.Время выполнения запроса 2.Количество занимаемого места таблицей

Решение задачи: «Выборка пользователей со сложным условием»

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.

  1. SELECT name,id_user FROM USER - выборка полей name и id_user из таблицы USER
  2. WHERE id_user NOT IN( - условие, что id_user не входит в список id_s
  3. SELECT id_s FROM friends - выборка поля id_s из таблицы friends
  4. WHERE id_f=$user_id - условие, что id_f равно переменной $user_id
  5. UNION ALL - объединение результатов предыдущих запросов
  6. SELECT $user_id - выборка значения переменной $user_id Список исключений формируется в целях предотвращения выборки пользователей, которые являются друзьями пользователя с указанным id.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5