У меня есть 3 таблицы:
Мне нужно получить все данные из таблицы местоположений с условием, что если человек, который запрашивает местоположение, представлен в черном списке как блокировщик или заблокирован, не увидит это запрещенное местоположение. Например:
Blacklist:
10 11
Location
10 74.1231 51.12312
11 82.1231 -1.31241
12 10.2121 34.12312
если 12 запрашивают местонахождение, он получает все. если 11 запрашивает местоположение, он получит только местоположение 12, то же самое, что и 10.
Нужна помощь в запросе






Вы можете использовать объединение для получения как blockerid, так и blockedid в качестве идентификатора для not in
select *
from localtion
where uuid not in (
select blockerid as my_id
from (
select blockerid, blockedid
from Blacklist
where blockerid = your_id
or blockedid = your_id
) AS alias
union
select blockedid
from (
select blockerid, blockedid
from Blacklist
where blockerid = your_id
or blockedid = your_id
) AS alias
)
@RaymondNijland .. спасибо за (правильное) редактирование .. голосование где-то
Я настоятельно рекомендую разбить запрос следующим образом:
select l.*
from location l
where not exists (select 1 from blocklist bl where bl.blockerid = l.uuid and bl.blockedid = ?) and
not exists (select 1 from blocklist bl where bl.blockedid = l.uuid and bl.blockerid = ?);
? - это заполнитель для идентификатора пользователя, который вас интересует.
Это может использовать преимущества двух индексов на blocklist, blocklist(blockerid, blockedid) и blocklist(blockedid, blockerid) для значительного увеличения производительности.
Можете ли вы предоставить лучший пример данных со всеми задействованными таблицами (пользователи, черный список и местоположение) и разместить их на sqlfiddle.com? А также обеспечить более ожидаемые результаты на основе данных примера для условий «если 12 запрашивает местоположение, он получает все. Если 11 запрашивает местоположение, он получит только местоположение 12, то же самое, что и 10».