友谊系统Sql Structure&询问

时间:2009-12-25 19:01:26

标签: php sql mysql join

我正在编写一个友谊系统,它有两个表。

成员信息

  • ID
  • 用户名
  • 密码

朋友

  • ID
  • USER_ID
  • friend_id
  • 状态

假设我想要一个可以选择成员$ userId的朋友ID的查询,如何在一个查询中进行此操作?

我找到了一个可以进行2次查询的解决方案。第一个选择朋友WHERE user_id = $userId,第二个选择朋友WHERE friend_id = $userId,然后将它们混合在一个数组中。如果没有其他解决方案,我将使用它。

请对SQL结构和&amp ;;疑问?

4 个答案:

答案 0 :(得分:4)

使用:

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

答案 1 :(得分: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

答案 2 :(得分:1)

为什么不为1个友谊插入2行。例如:

假设我们有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)

因此您可以通过简单的选择查询轻松选择。

此外,它还可以缓解您下一个问题“如何找到共同朋友”的痛苦。

答案 3 :(得分: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列。