2009-02-24 120 views
1

我有2個表:如何在場景中使用INNER JOIN?

'用戶' 表

 
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

能幫我嗎?

回答

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; 

編輯: 這是一樣的:

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場。 – 2009-02-24 10:08:30

+0

謝謝指出。修復它(和其他一些東西) – tehvan 2009-02-24 10:12:04

+0

我試過所有的答案。只需將u.user_id更改爲u.id,其工作... 但chris mehrdad和gordon的回答不起作用。 – roa3 2009-02-24 10:14:23

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

你確定你不想朋友錶鏈接到用戶表上,而不是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 
4
SELECT u.username 
FROM Friends f, Users u 
WHERE f.user_id = u.id 
     AND f.friend = 1 
     AND f.friend_id = '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

dmcgiv有你需要考慮一下,如果朋友的映射是雙向的(即,如果A是朋友爲B,那麼B將自動爲朋友A)很重要的一點。您需要檢查您感興趣的用戶是否位於Friends表格映射的任一側。

你可以做到這一點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 其中f。朋友= 1)

0

嘗試此查詢

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