列出所有朋友并加入users表

时间:2011-02-21 16:12:28

标签: php mysql database social-networking

我有一个名为' friends'并且它有列' user_id'和' friend_id'。 user_id是invitor,friend_id是收件人。请注意,当创建友谊时,我不会在数据库中创建2条记录,如1,2和2,1。

如何列出我的所有朋友,考虑到我的users.user_id可以在朋友'中的friends.friend_id和friends.user_id之间变化。表。另外,如何将查询加入“用户”#39;用来获取我所有朋友的名字。

3 个答案:

答案 0 :(得分:3)

一个选项是两个查询的联合:​​

select u.name
    from friends f
        inner join users u
            on f.user_id = u.user_id
    where f.friend_id = @YourID
union
select u.name
    from friends f
        inner join users u
            on f.friend_id = u.user_id
    where f.user_id = @YourID

答案 1 :(得分:2)

您应该加入查询以获得最佳效果。尝试这样的事情:

$friends_result = mysql_query("
    SELECT
        users.`name` AS name
    FROM
        friends
    LEFT JOIN
        users
    ON
        users.`id` = friends.`user_id`
    OR
        users.`id` = friends.`friend_id`
    AND
        users.`id` != '" . $user_id . "'
    WHERE
        friends.`user_id` = '" . $user_id . "'
    OR
        friends.`friend_id` = '" . $user_id . "'");

echo "<strong>My friends:</strong><br />";

while($friends_array = mysql_fetch_array($friends_result))
{
    echo $friends_array['name'] . "<br />";
}

答案 2 :(得分:0)

我认为最简单的方法是确保friends表中user_id列中的ID较低,而另一列中的ID较高。 这样,您无需检查两次,从而实现更好的性能。

但是,这种方法要求您修改添加好友的代码并假定用户ID永远不会更改(或者您必须更新表中的ID)。

否则,使用像Joe所说的UNION个查询或使用OR条件(例如JOIN ... ON u.user_id = friends.user_id OR u.user_id = friends.friend_id)或INJOIN ... ON u.user_id IN (friends.user_id, friends.friend_id))进行加入是昂贵的操作(使用EXPLAIN和基准来找出)。