2011-06-28 69 views
0

我的用戶表並非不尋常,它使用主要ID字段作爲用戶ID。將朋友和用戶表連接在一起(獲取朋友的用戶名?)

我的朋友表看起來像這樣但是:

CREATE TABLE `friends` (
    `uid` INT NOT NULL ,      
    `fid` INT NOT NULL ,     
    PRIMARY KEY (`user_id`, `friend_id`) 
) ENGINE = MYISAM ; 

我可以很容易地找到一個用戶的朋友,即

SELECT fid FROM friends WHERE uid = 12 

,這將基本上返回ID形式好友列表,但我不知道哪種方法根本就不知道如何獲取他們的用戶名或其他數據。我聽說過外鍵(當然還有加入),我不確定如何真正選擇我需要做的事情。

現在我做這個醜陋的方法:

SELECT username FROM users WHERE id IN (1,2,3,4..(other fid's)..) 

它看起來不正確的。

我應該怎麼做?

+0

外鍵也是有用的東西,但在你的情況下不是必需的。他們提供相關的數據庫一致性 – heximal

回答

1

會更容易些。 假設你有以下字段的用戶表:ID,用戶名,電子郵件......什麼,你可以做以下簡單的連接:

SELECT * FROM friends 
INNER JOIN users 
ON users.id = friends.fid 
WHERE friends.uid = 1; 

做這當然是有什麼選擇朋友記錄這符合WHERE標準,並根據這些記錄根據ON子句中定義的關係在users表中找到適當的行。 (技術上在數據庫引擎它的工作原理有點不同,雖然)在所得到的行集,將包括來自朋友和用戶表中的所有列,但您可以通過定義SELECT像修改結果列:

SELECT friends.uid as uid, friends.fid as fid , users.username as username 

您不需要在朋友表中明確定義一個外鍵來完成這樣的簡單連接。但是這樣做可以幫助您跟蹤表之間的關係,此外,您可以讓MySQL在刪除或更新行時自動保持數據庫的一致性。 http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

+0

謝謝你的例子,與我正在做的相比,它看起來非常好,我有藉口終於學習JOIN語法!感謝您提及'as'部分,測試時會爲我節省幾毛。 –

0

你應該使用JOIN。你應該加入的朋友表與用戶表:

select 
    f.fid, 
    u.name as friend_name 
from 
    friends f 
join 
    users u on u.id = f.fid and f.uid = 16 
+0

而且基本上會返回所有的朋友ID並從用戶表匹配它們並打印您喜歡的任何列。您可以執行「select * ...」查看返回的所有列。 –

+0

是的,你說得對。我編輯了我的答案 – heximal

0
SELECT 
     u.username, 
     f.fid 
FROM 
     friends f, 
     users u 
WHERE 
     f.uid = 12 and 
     u.uid = f.fid 
0

首先,不要以爲主鍵是你提供

PRIMARY KEY (`user_id`, `friend_id`) 

這些列中不存在創建表的有效在你的桌子上。

第二:如果您已經發布您的用戶表太

SELECT users.username FROM friends,users WHERE users.id=friends.fid 
相關問題