SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.06.2016 20:24:43

Kartak
Участник
Зарегистрирован: 03.06.2016
Сообщений: 3

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

Есть две таблицы:
Первая user - список пользователей сайта
Вторая 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.Количество занимаемого места


Прикрепленные файлы:
Attachment Icon Безымянный.jpg, Размер: 31,971 байт, Скачано: 299

Неактивен

 

#2 03.06.2016 23:40:33

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

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

Добавите distinct в запрос после select - не будет дублей.
Что до оптимизации - тут лучше по мере поступления.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 04.06.2016 03:50:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

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

что-то вы усложнили

select * from user where id_user not in(
select id_s from frends where id_f=$user_id -- те у кого принял дружбу юзер
union all
select id_f from frends where id_s=$user_id -- те кому отправлял запрос на дружбу юзер
union all
select $user_id -- сам юзер
);


Kartak написал:

Приоритеты:
2.Количество занимаемого места

А что это такое?

Неактивен

 

#4 04.06.2016 18:12:41

Kartak
Участник
Зарегистрирован: 03.06.2016
Сообщений: 3

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

deadka написал:

Добавите distinct в запрос после select - не будет дублей.
Что до оптимизации - тут лучше по мере поступления.

distinct почему-то не работает ...
Выводил то же что и без него
Решил проблему с помощью GROUP BY

Работающий запрос:

SELECT name,id_user
            FROM user LEFT JOIN friends
            ON user.id_user = friends.id_s
            WHERE
            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
            )
            AND id_user != $user_id
            GROUP BY id_user


Спасибо за ответ

Неактивен

 

#5 04.06.2016 18:42:10

Kartak
Участник
Зарегистрирован: 03.06.2016
Сообщений: 3

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

vasya написал:

что-то вы усложнили

select * from user where id_user not in(
select id_s from frends where id_f=$user_id -- те у кого принял дружбу юзер
union all
select id_f from frends where id_s=$user_id -- те кому отправлял запрос на дружбу юзер
union all
select $user_id -- сам юзер
);

А что это такое?

Спасибо за ответ.Вы мне очень помогли. Буду использовать ваш запрос.

Kartak написал:

Приоритеты:
2.Количество занимаемого места

Имел в виду что мне не важно количество дополнительных колонок в таблице если от того производительность увеличится.

Отредактированно Kartak (04.06.2016 18:43:33)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson