2009-02-24 7 views
1

У меня есть 2 таблицы:Как использовать INNER JOIN в сценарии?

Таблица 'Users' Таблица

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

'Friends'

 
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

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

ответ

0
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)) 
1
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

Там нет u.user_id поля. –

+0

спасибо, что указал. (и некоторые другие вещи) – tehvan

+0

Я пробовал все ответить. Просто измените u.user_id на u.id, его рабочий ... Но chris mehrdad и gordon не работают. – roa3

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

Я пробовал несколько раз, не работал .. – roa3

+0

Я думаю, что «WHERE» должно быть «friends.friend_id = 0004» вместо user_id –

+0

Yup, после того, как я перехожу из friends.user_id в friends.friend_id, теперь он работает. Спасибо миллиону – roa3

1

Вы уверены, что вы не хотите, чтобы связать таблицу друзей в таблице пользователей на user_id вместо of 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 
4
SELECT u.username 
FROM Friends f, Users u 
WHERE f.user_id = u.id 
     AND f.friend = 1 
     AND f.friend_id = '0004' 
+0

не нужно указывать идентификатор пользователя 0004 ?? – roa3

+0

@userID может использоваться как параметризованный запрос, поэтому вы можете передать его в «0004». Я изменил выбранный выше, чтобы вы могли запускать его прямо. Однако вы действительно должны использовать параметризованные запросы для защиты от атак SQL-инъекций. Никогда не добавляйте «0004» к вашему запросу. –

+0

Что я имею в виду, что кто-то вошел «OR 1 = 1 - Вы бы в конечном итоге с И f.friend_id =„“OR 1 = 1 --0004» –

1

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

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
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 
+0

Это слишком продвинутое для меня. Btw, ваш метод будет быстрее (быстрее в получении данных), а затем другие? – roa3

+0

Предполагаю, вы ссылаетесь на второй запрос. Речь идет о завершении, если вы хотите двунаправленный поиск, тогда это единственный запрос, который выполняет эту работу. Что касается скорости, которая будет зависеть от ваших индексов полей таблицы. –

0

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

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

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

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

0

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

0

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

select u.username from users u join friends f on u.id=f.user_id and f.friend=1;