Как исправить запрос Sql - PullRequest
0 голосов
/ 03 мая 2019

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

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

имя_пользователя имя фамилия

   2      John        drake         
   3       Hamer      Joy       
   4        Finter     Richy    

таблица друзей

friends_id user_id friend_id

   1           2          3         
   2            4         2         
   3            4         3

вот запрос, который я выполнил

SELECT a.friends_id,a.user_id, 
       a.friend_id, b.firstname, b.lastname
FROM friends AS a,users As b
WHERE (a.friend_id = b.user_id OR a.user_id = b.user_id) AND
      (a.friend_id = 2 OR a.user_id =2)

вот результат, который я получаю

friends_id  user_id  friend_id  firstname   lastname    
   1           2       3          John      drake       
   1           2       3          Hamer     Joy         
   3           4       2          John      drake       
   3           4       2           Finter    Richy  

Эторезультат, который я ожидаю

friends_id  user_id  friend_id  firstname   lastname    
   1           2       3          Hamer     Joy         
   3           4       2           Finter    Richy

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Я думаю, что проблема с вашим исходным запросом в том, что вы используете условие ИЛИ в своих объединениях. Обычно ИЛИ в условиях соединения не помогают.

Вот еще одно решение, которое немного короче и использует синтаксис соединения ANSI, чтобы вы могли четко видеть проекции. Отказ от ответственности, я не проверял его в базе данных, поэтому может быть ошибка. Однако вы также можете получить доступ к исходному имени пользователя, если хотите (я добавил это как последние два столбца).

select F.friends_id, U.user_id, FR.user_id,
    FR.firstname, FR.lastname,
    U.firstname, U.lastname
FROM users U join Friends F on
        U.user_id = F.user_id
    JOIN Users FR on
        F.friend_id = FR.user_id
where U.user_id = 2 or FR.user_id = 2
;

Как правило, использование синтаксиса соединения ANSI значительно облегчает чтение вашего запроса и помогает определить все условия объединения. Это также дает вам легкий доступ к большему количеству типов соединений.

0 голосов
/ 03 мая 2019

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

select a.friends_id, a.user_id, a.friend_id, b.firstname, b.lastname
from friends a, users b
where a.user_id = 2 and b.user_id = a.friend_id 

union

select a.friends_id, a.user_id, a.friend_id, b.firstname, b.lastname
from friends a, users b
where a.friend_id = 2 and b.user_id = a.user_id

Это все один запрос, полученный в результате union из 2 внутренних запросов.

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