Как использовать INNER JOIN в сценарии? - PullRequest
1 голос
/ 24 февраля 2009

У меня есть 2 таблицы:

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

id      username  
----    -------- 
0001    user1          
0002    user2          
0003    user3          
0004    user4     

Таблица «Друзья»

user_id  friend_id  friend
-------  ---------  ------
0001     0004       1
0002     0004       1
0005     0004       0

Как отобразить имя всех друзей user4? если в таблице друзей столбец друзей, 1 означает, что они друзья, 0 означает, что они все еще не друзья.

Я использую INNER JOIN, который выглядит следующим образом:

SELECT users.username
FROM `users`
INNER JOIN `friends` ON users.id = friends.friend_id
WHERE friends.user_id = 0004
  AND friend = 1;

Но я получаю:

user4 и user4 вместо user1 и user2

Может мне помочь?

Ответы [ 10 ]

4 голосов
/ 24 февраля 2009
SELECT u.username
FROM   Friends f, Users u
WHERE  f.user_id = u.id
       AND f.friend = 1
       AND f.friend_id = '0004'
3 голосов
/ 24 февраля 2009
SELECT users.username
FROM `users`
INNER JOIN `friends` ON users.id = friends.user_id
WHERE friends.user_id = 0004
  AND friend = 1;
1 голос
/ 24 февраля 2009
select U.Username
from
    Users as U
    inner join Friends as F on U.Id = F.user_id and F.friend = 1
where
    F.friend_id = '0004'

Если таблица друзей - это просто таблица сопоставления, то вы не хотите отображать оба пути?

select U.Username
from
    Users as U
    left outer join
    (
        select 
            F.user_id as Id
        from
            Friends as F
        where
            F.friend_id = '0004'
        and
            F.friend = 1

    ) as Mapping1 on Mapping1.Id = U.id
    left outer join
    (
        select 
            F.friend_id as Id
        from
            Friends as F
        where
            F.user_id = '0004'
        and
            F.friend = 1

    ) as Mapping2 on Mapping2.Id = U.id

where
    Mapping1.Id is not null or Mapping2.Id is not null
1 голос
/ 24 февраля 2009

Вы имеете в виду, как это?

SELECT u.username
FROM friends AS f
INNER JOIN users AS u USING user_id
WHERE f.friend_id = 0004 AND f.friend = 1
1 голос
/ 24 февраля 2009

Вы уверены, что не хотите связать таблицу друзей с таблицей пользователей в user_id вместо friend_id? Затем измените предложение where, чтобы использовать friend_id вместо user_id. Существуют разные способы форматирования объединения, но способ, которым вы делаете это с использованием внутреннего объединения, выглядит хорошо.

SELECT users.username
FROM `users` 
INNER JOIN `friends` ON users.id = friends.user_id 
WHERE friends.friend_id = 0004   
AND friend =1
1 голос
/ 24 февраля 2009
select u.username
from friends f, users u
where f.friend_id='0004' and f.friend=1 and f.id=u.user_id;

Edit: Это так же, как:

select u.username
from friends f inner join users u on f.id=u.user_id
where f.friend_id='0004' and f.friend=1;
0 голосов
/ 12 марта 2015

Попробуйте этот запрос

select u.username from users u join friends f on u.id=f.user_id  and f.friend=1;
0 голосов
/ 31 августа 2009

выберите имя пользователя из пользователей us где us.id в ( выберите f. [user_id] из пользователей u внутреннее объединение друзей е ON u.id = f.friend_id где f.friend = 1)

0 голосов
/ 25 февраля 2009

У dmcgiv есть важный момент, о котором вам следует подумать, если отображение друзей является двунаправленным (то есть, если A дружит с B, то B автоматически дружит с A). Вам нужно проверить, находится ли интересующий вас пользователь по обе стороны от таблицы друзей.

Вы можете сделать это способом dmcgiv, или другим способом было бы просто вставить ссылки в обоих направлениях в таблицу друзей, когда вы добавляете дружбу. Например, если пользователь 0004 дружит с пользователем 0006, вы должны вставить в таблицу друзей:

user_id | friend_id | friend
0004    | 0006      |   1
0006    | 0004      |   1

Кстати, я не думаю, что вам действительно нужна колонка друзей. Если нет причин отслеживать «не друзей», вы можете просто удалить сопоставление из таблицы «Друзья», если дружба заканчивается.

0 голосов
/ 24 февраля 2009
SELECT u.username
FROM Friends f, Users u
WHERE f.friend = 1 AND 
 ((f.friend_id = @userid AND f.user_id = u.id) OR
  (f.user_id = @userid AND f.friend_id = u.id))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...