SQL запрос на получение Freinds of Freinds of Freinds (глубина 3) - PullRequest
0 голосов
/ 05 мая 2020

У меня есть 2 таблицы, а именно t_users и t_user_freinds . Схема довольно проста:

--------            --------
|t_users|          | t_users_freinds|
--------            -----------------
| id   |           | id             |
--------           ------------------
| name |           |user_1          |
--------            ----------------
                   | user_2         |
                    ----------------

Мой вопрос: как мне найти друзей друзей друзей (уровень глубины 3) для данного человека с id = 1?

Идентификатор просто число от 1 до x. Пользователь_1 - друг пользователя_2. Оба пользователя user_1 и user_2 существуют в таблице t_user.

Я новичок в SQL.

Спасибо.

ОБНОВЛЕНИЕ:

Я пробовал это

select t1.id, t1.name, 
        t2.user_2 as freinds, t3.user_2 as freinds_of_freinds
from t_user t1 
    inner join t_user_friend t2 on t2.user_1 = t1.id 
    inner join t_user_friend t3 on t2.user_1 = t2.user_2 
WHERE t1.id = "1"

Но это не сработало и выдает нулевой результат (хотя ошибок нет.)

Для поиска только друзей пользователя:

select t1.id, t1.name, 
        t2.user_2 as friends
from t_user t1 
    inner join t_user_friend t2 on t2.user_1 = t1.id 
WHERE t1.id = "1"

Это сработало, как ожидалось.

Поиск друзей из друзей из друзей

select t1.id, t1.name, t2.user_2 as freinds, t3.user_2 as freinds_of_freinds
from t_user t1
inner join t_user_friend t2 on t2.user_1 = t1.id 
inner join t_user_friend t3 on t3.user_1 = t2.user_2
WHERE t1.id = "5"

Этот запрос SQL, похоже, работает, как ожидалось. Всем спасибо.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Этот запрос SQL работает должным образом и отвечает на мой вопрос:

select t1.id, t1.name, t2.user_2 as freinds, t3.user_2 as freinds_of_freinds
from t_user t1
inner join t_user_friend t2 on t2.user_1 = t1.id 
inner join t_user_friend t3 on t3.user_1 = t2.user_2
WHERE t1.id = "5"

Всем спасибо.

0 голосов
/ 05 мая 2020

Если я правильно понимаю вашу модель данных, попробуйте ниже:

SELECT users.id,
           users.name,
           frnds.user_2 as friends,
           frndsoffriends.user_2 as friendsoffriends
    FROM t_user_friends frnds,
        t_user_friends frndsoffriends,
        t_users users
     WHERE users.id = 1 
     AND frnds.user_1 = users.id
     AND frnds.user_2 = frndsoffriends.user_1

EDIT: с явным JOIN в заявлении, если это ваш предпочтительный стиль кодирования.

   select t1.id, t1.name, 
        t2.user_2 as freinds, t3.user_2 as freinds_of_freinds
from t_user t1 
    inner join t_user_friend t2 on t2.user_1 = t1.id 
    inner join t_user_friend t3 on t2.user_2 = t3.user_1 
WHERE t1.id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...