2014-02-09 2 views
3

У меня есть система Блок пользователя:LEFT JOIN Таблица A зависит от таблицы B

Таблица А:

------------------- 
id_user | username 
------------------- 
    1 | A 
------------------- 
    2 | B 
------------------- 
    3 | C 
------------------- 
    4 | D 
------------------- 

.... and so on 

Таблица B:

-------------------------------------- 
id_block | user_request | user_banned 
-------------------------------------- 
    1 |  1  |  2 
-------------------------------------- 
    2 |  1  |  3 
-------------------------------------- 
... and so on 

Case # 1 : Когда пользователь A получает список пользователей из таблицы A, так что пользователь B и пользователь C скрыты от него.

Дело № 2: Когда пользователь B получает список пользователей из таблицы A, так что пользователь A скрыт от него.

Дело № 3: Когда пользователь C получает список пользователей из таблицы A, так что пользователь A скрыт от него.

Дело № 4: Когда пользователь D получает список пользователей из таблицы A, поэтому он получает всех пользователей.

До сих пор я попытался это:

SELECT t1.id_user, t1.username 

FROM user t1 

    LEFT JOIN block_user t2 

    ON (t2.user_request = 1 AND t2.user_banned = 1) 

WHERE t1.id_user NOT IN 

    (SELECT user_request FROM block_user WHERE user_request = 1) 

    AND t1.id_user NOT IN 

    (SELECT user_banned FROM block_user WHERE user_banned = 1) 

В результате пользователем B и C скрыты! Большой!

Но, когда вы меняете Идентификатор пользователя на пример 2, тогда скрываются символы «Пользователь» и «С». Не здорово, должен быть только скрытый пользователь A!

Когда вы меняете Идентификатор пользователя на 4, тогда скрывается пользователь A, B и C.

я сделать несколько примеров для этого случая:

sqlfiddle User ID 1

sqlfiddle User ID 2

sqlfiddle User ID 3

sqlfiddle User ID 4

P.D. Я знаю, я могу сделать два запроса, чтобы иметь решение для этого, но для этого должно быть решение.

+1

[там я идти] (http://sqlfiddle.com/#!2/02377/111) – Wrikken

ответ

2
SELECT t1.id_user, t1.username 
FROM user t1 
LEFT JOIN block_user t2 
ON 
    (t2.user_request = <current user id> AND t2.user_banned = t1.id_user) 
    OR 
    (t2.user_request = t1.id_user AND t2.user_banned = <current user id>) 
WHERE t2.id_block IS NULL; 

see the fiddle in action for A, B, C & D

Смежные вопросы