Как сделать выбор из 2 строк в MySQL - PullRequest
0 голосов
/ 05 июля 2018

У меня есть две таблицы users и blocked, функция, которую я хочу сделать, - это функция типа Facebook, Instagram и т. Д., Когда пользователь блокирует другую, я имею в виду, если я пользователь 8 блокирую пользователь 9 пользователь 9 не может видеть меня, но он может видеть всех других пользователей

способ, которым я пытаюсь сделать запрос, следующий

 Select * from users WHERE id NOT IN 
(Select idblock from blocked where blocked.idBlock = users.id);

это таблица заблокированных

enter image description here

а это таблица пользователей

enter image description here

проблема, с которой я сталкиваюсь, заключается в том, что при входе в систему с пользователем с идентификатором 3 все в порядке, но при входе в систему, когда пользователь с другим идентификатором не показывает других пользователей

что я ожидаю от запроса, это (что правильно)

enter image description here

, как вы можете видеть в таблице заблокированных, идентификаторы (пользователи) ohters блокируют меня, кроме идентификатора 11, но если я захожу в систему как пользователь id 10, покажите мне это

enter image description here

так что я не хочу этого, потому что id 10 не заблокирован

Я надеюсь, что кто-то понимает меня

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Вам нужно написать NOT exists в подзапросе и отметить b.IdBlocked в подзапросе.

SELECT *
FROM users u 
WHERE NOT exists 
(
  Select idblock 
  from blocked b 
  where b.idBlock = u.id AND b.IdBlocked = 3
) AND u.id <> 3

sqlfiddle: http://sqlfiddle.com/#!18/c14ee/13

Если User ID = 3, то

Результаты

| ID |
|----|
| 11 |

Если User ID = 10, то

SELECT *
FROM users u 
WHERE NOT exists 
(
  Select idblock 
  from blocked b 
  where b.idBlock = u.id AND b.IdBlocked = 10
) AND u.id <> 10

Результаты

| ID |
|----|
|  3 |
|  8 |
|  9 |
| 11 |
0 голосов
/ 05 июля 2018

Я бы использовал LEFT JOIN для выполнения требуемого вывода.

В следующем запросе делается попытка сопоставить запросы на блокировку для указанного пользователя (# 3) со всеми другими пользователями в базе данных (LEFT JOIN) и вернуть только тех пользователей, которые не были заблокированы (WHERE b.id IS NULL) ).

SELECT u.*
FROM users u
LEFT JOIN blocked b ON (u.id = b.idBlock AND b.idBlocked = 3)
WHERE u.id <> 3
AND b.id IS NULL;
...