2009-12-25 72 views
4

我正在編寫一個友誼系統,它有兩個表格。友誼系統Sql結構與查詢

成員

  • ID
  • 用戶名
  • 密碼

朋友

  • ID
  • user_id說明
  • friend_id
  • 狀態

比方說,我希望有一個查詢,可以選擇朋友的會員$用戶id的標識如何能夠使這個在一個查詢?

我找到了一個解決方案,它可以做2個查詢。拳頭選擇朋友在哪裏user_id = $userId第二個選擇朋友在哪裏friend_id = $userId然後將它們混合在一個數組中。如果沒有其他解決方案,我將使用它。

請同時提供SQL結構的任何想法&查詢?

回答

3

用途:

SELECT f.friend_id 
    FROM FRIENDS f 
WHERE f.user_id = $user_id 
UNION 
SELECT t.user_id 
    FROM FRIENDS t 
WHERE t.friend_id = $user_id 

使用UNION將刪除重複。 UNION ALL會更快,但不會刪除重複項。

如果你想從MEMBERS表中,使用得到朋友的信息:

SELECT m.* 
    FROM MEMBERS m 
    JOIN (SELECT f.friend_id 'user_id' 
      FROM FRIENDS f 
     WHERE f.user_id = $user_id 
     UNION 
     SELECT t.user_id 
      FROM FRIENDS t 
     WHERE t.friend_id = $user_id) x ON x.user_id = m.id 

BTW:我希望你在使用變量mysql_escape_string,否則,你的風險SQL注入攻擊: alt text

+0

您的代碼正是我需要的!非常感激。接受你的答案。 – MoeAmine 2009-12-25 19:31:50

+0

function safeDB($ text){ return mysql_real_escape_string(strip_tags(trim($ text))); } 我相信這很好:) – MoeAmine 2009-12-25 19:47:53

+0

@amindzx:很酷,只是檢查。有些人對SQL注入攻擊感到憤怒 – 2009-12-25 19:57:28

1

你應該能夠使用

SELECT m.* 
FROM friends f INNER JOIN 
     members m ON f.friend_id = m.user_id 
WHERE f.user_id = $userId 

嘗試這會給你所有的朋友細節

兩全看看

SELECT DISTINCT CASE WHEN f.user_id = $userId then f.friend_id else f.user_id END CASE 
FROM friends f 
WHERE f.user_id = $userId 
OR  f.friend_id = $userId 
+0

它似乎很複雜,但我會嘗試它。謝謝,你能推薦一些好的資源來了解這個嗎? – MoeAmine 2009-12-25 19:14:04

+0

這是非常標準的Sql。你需要Sql幫助嗎? – 2009-12-25 19:15:30

+0

#1054 - 'on子句'中的未知列'master.user_id' – MoeAmine 2009-12-25 19:17:46

0

既然你要求簡單的東西,如:

SELECT friend_id FROM friends WHERE user_id = id; [fill in the id] 

我給你的東西票友:

SELECT * FROM members AS m 
WHERE m.id 
IN (SELECT f.friend_id FROM friends AS f 
    WHERE f.user_id = (SELECT pm.id FROM members AS pm 
    WHERE pm.username = 'amindzx')); 

使用連接在一個子查詢誠然會更好。

另外,在朋友欄中不需要id,因爲只有user_idfriend_id之間的關係應該存在;這些都可以統一描述爲id列。

+0

你完全正確的ID,但是這個查詢可以得到如果friend_id鏈接到user_id以及沒有重複?我的意思是相反的。 – MoeAmine 2009-12-25 19:22:10

+0

我很想回答你的問題,但我不明白你的意思。通過「逆」你是否意味着你想找到所有有特定朋友的用戶?這看起來像'從friend_id = 1'的朋友中選擇user_id(假設1 =相關用戶的ID)。 – dlamblin 2009-12-27 06:41:27

1

爲什麼不插入2行1友誼。例如:

比方說,我們有2個用戶成爲朋友

USER_ID:1 & Friend_id:2

insert into friends (user_id, friend_id, status) values (1,2,0)  
insert into friends (user_id, friend_id, status) values (2,1,0) 

,所以你可以通過簡單的選擇查詢輕鬆選擇。

此外,它將緩解您的可能的下一個問題「如何找到共同的朋友」的痛苦。

+0

這是一個大型社交網站的好方法嗎? – MoeAmine 2009-12-26 14:53:17