Как сделать SQL JOIN с исключением - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть 3 таблицы:

  1. пользователи [идентификатор, имя]
  2. черный список [blockerid, заблокирован]
  3. location [uuid, lat, lon]

Мне нужно получить все данные из таблицы местоположений с условием, что если человек, который запрашивает местоположение, будет представлен в черном списке как блокировщик или заблокирован, он не увидит это запрещенное местоположение. Например:

Blacklist:
10 11

Location
10 74.1231 51.12312
11 82.1231 -1.31241
12 10.2121 34.12312

если 12 просит указать местоположение, он получает все. если 11 просит местоположение, он получит только местоположение 12, такое же, как 10.

Нужна помощь в запросе

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Я бы настоятельно рекомендовал разбить запрос на:

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) для значительного увеличения производительности.

0 голосов
/ 28 апреля 2018

Вы можете использовать объединение для получения и blockerid, и blockid в качестве идентификатора для не в

  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

  )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...