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

Таблица1: Пользователи : user_id user_name

Таблица2: Последователи : user_name followed_user_name

(Предположим, имена уникальны)

Я хочу создать запрос, чтобы получить то же самое, что и Table2 , но меняя каждое user_name на id и follower_user_name на id. Я сбит с толку, потому что оба они одного типа.

Что у меня так далеко:

SELECT 
   table1.user_id, 
   table2.follower_user_name    #This needs to be replaced
FROM table2
INNER JOIN table1
    ON table2.user_name = table1.user_name 

PS: это база данных, с которой я работаю, я ее не проектировал. Не уверен, почему они просто не использовали идентификаторы в таблице подписчиков.

1
LucasP 27 Ноя 2016 в 22:56

2 ответа

Лучший ответ

Вы можете присоединиться к followers users дважды , один раз для имени пользователя и один раз для имени пользователя, на которого подписаны:

SELECT u1.id, u2.id
FROM   followers f
JOIN   users u1 ON u1.user_name = f.user_name
JOIN   users u2 ON u2.user_name = f.followed_user_name
1
Mureinik 27 Ноя 2016 в 19:59

Я нахожу принятый ответ немного странным: результат с двумя атрибутами с одинаковым именем ?! Излишне говорить, что такой результат нереляционален.

Если вы согласны с тем, что нам необходимо использовать реляционный оператор rename (в SQL он называется AS), тогда мы можем поместить операцию в табличное выражение, что позволит использовать NATRUAL JOIN, что делает нас, родных, счастливыми:

SELECT user_id, follower_user_id
  FROM table2
       NATURAL JOIN table1
       NATURAL JOIN 
       ( SELECT user_id AS follower_user_id, 
                username AS follower_user_name 
           FROM table1 ) f;
1
onedaywhen 28 Ноя 2016 в 08:44