2011-02-17 50 views
0

我有這兩個表:使用mysql的朋友realtionships?

user{id,name,password....}; 
friends{id,user_id,user_id2,accept(bool)} 

例如說,我想爲USER_ID = 14取出的朋友和行接受必須是1!如何將我做MySQL查詢謝謝:)

PS。 fethcing查詢時,它必須是一個2路的事情,如果user1的朋友user2的 也意味着,用戶2是朋友USER1,如果你明白我的意思! :))

+0

平請澄清。如果A和B是朋友,則朋友表中有兩條記錄 - >(0,A,B,true); (1,B,A,真)如果雙方都接受了友誼。 (0,A,B,false); (1,B,A,真)如果只有B接受了友誼等等。對嗎? – 2011-02-17 21:32:33

回答

1

我並不想棄用,但是這是非常,非常基本的SQL,你可以很容易地發現,通過谷歌或書籍的答案。這就是說,這是答案。

SELECT * FROM friends WHERE (user_id=14 OR user_id2=14) AND accept=true; 

讓我打破它給你,因爲你使用的是SQL,如果你不學習它,你將浪費大量的時間尋找答案。

SELECT * FROM friends 

表示獲取朋友的所有行。 「*」是列名的替代,意思是「所有列」。例如,如果您有

SELECT (id,user_id) FROM friends 

返回的行將只包含那些列。

然後是WHERE子句。

WHERE (user_id=14 OR user_id2=14) AND accept=true 

意味着它的外觀:您選擇的行應該至少有一個user_id等於14,並且接受應該爲true。 MySQL使用true,false和null(如果允許)布爾值。一些其它數據庫,如MSSQL,其採用了「BIT」類型,而不是一個布爾分別使用1,0或null爲真,假和空。

or子句是因爲,你在你的編輯說,這種友誼可以是「2路」。

所以,如果你把它放在一起,

SELECT * FROM friends WHERE (user_id=14 OR user_id2=14) AND accept=true; 
+0

我認爲這會給你重複的結果。 – 2011-02-17 21:19:23

0

這會給你的每一行的USER_ID = 14接受朋友

SELECT 
    * 
FROM 
    friends 
WHERE 
    user_id = 14 
    AND 
    accept = TRUE 
2

請嘗試以下方法。

select 
f1.user_id2 
from 
user u,friends f1 , friends f2 
where 
f1.user_id1 = 14, 
f1.accept = 1, 
f1.user_id2 = f2.user_id1, 
f2.user_id2 = f1.user_id1, 
f2.accept = 1 

感謝, 羅漢

編輯:時纔有意義加入用戶u表,如果你需要朋友的詳細信息。否則,你可以把用戶的桌子拿出來。

1

我可能不會做,在兩個表。讓我感覺這是用戶之間的多對多關係。您遇到的問題是您在朋友表中限制了「朋友」的數量。這是除非你有朋友表作爲用戶的孩子。我假設朋友表中有一個外鍵指向用戶。我認爲你在那裏的一部分,但不知道爲什麼你有user_id2,因爲它沒有關係意義。在這種情況下,查詢是:

select * 
from user 
    inner join friends on friends.user_id = user.id 
where friends.id = true