2009-12-25 87 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