SQL проверить, есть ли запись из другой таблицы, и если да, сделать что-то - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть две таблицы: users и friendships

id   |  name   | password              
-------------------------
 1    |  Dave   | 1234   
-------------------------
 2    |  John   | abcd   
-------------------------
 3    |  Bob    | xyz    
-------------------------

и friendships

 friend_one   |  friend_two   | status              
 -------------------------------------
       1      |      1        |   me
 -------------------------------------
       2      |      2        |   me   
 -------------------------------------
       3      |      3        |   me    
 ------------------------------------
       1      |      2        | pending
 -------------------------------------
       3      |      1        | active

Теперь, когда пользователь входит в систему, мне нужно чтобы получить всех пользователей в базе данных, мне также нужно добавить дополнительный столбец к результату запроса select, который показывает статус дружбы с текущим вошедшим пользователем.

Например, идентификатор пользователя 1, Дейв войдя в систему и запросив список пользователей, запрос выбора должен быть выведен, как показано ниже,

id   |  name   | password  | friend_status            
------------------------------------------
 1    |  Dave   | 1234     |   me
------------------------------------------ 
 2    |  John   | abcd     |   pending
------------------------------------------
 3    |  Bob    | xyz      |   active
------------------------------------------

Когда пользователь с идентификатором 2, Джон вошел в систему, ему нужно получить приведенную ниже таблицу,

 id   |  name   | password  | friend_status            
------------------------------------------
 1    |  Dave   | 1234     |   pending
------------------------------------------ 
 2    |  John   | abcd     |   me
------------------------------------------
 3    |  Bob    | xyz      |   null
------------------------------------------

Возможно ли это вообще? Я пытался объединить таблицы и использовать вложенный запрос

Например, с помощью приведенного ниже запроса я могу получить все данные о дружбе для текущего пользователя, вошедшего в систему:

select * from friendships
where friend_one = 2 or friend_two = 2

Но я не понять, что делать дальше. Я попытался поместить это как вложенный запрос основного запроса выбора и попытался объединить таблицы, но я не получаю то, что хотел.

Кто-нибудь может дать мне идею?

1 Ответ

1 голос
/ 13 апреля 2020

Вам нужно CROSS JOIN список id значений из users с таблицей users, чтобы получить все отдельные пары значений id, затем LEFT JOIN, которые в таблицу friendships получить друг status для каждого пользователя:

SELECT u1.id, u.name, u.password,
       f.status
FROM users u
CROSS JOIN (SELECT DISTINCT id
            FROM users) u1
LEFT JOIN friendships f ON f.friend_one = u.id  AND f.friend_two = u1.id
                        OR f.friend_one = u1.id AND f.friend_two = u.id
ORDER BY u1.id, u.id

Вывод:

id  name    password    status
1   Dave    1234        me
1   John    abcd        pending
1   Bob     xyz         active
2   Dave    1234        pending
2   John    abcd        me
2   Bob     xyz         (null)
3   Dave    1234        active
3   John    abcd        (null)
3   Bob     xyz         me

Демонстрация по SQLFiddle

Чтобы получить спецификацию c пользователь, просто добавьте WHERE u1.id = ? перед предложением ORDER BY.

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