【问题标题】:Listing all friends and joining to the users table列出所有朋友并加入用户表
【发布时间】:2011-02-21 16:12:28
【问题描述】:

我有一个名为“friends”的数据库,其中包含“user_id”和“friend_id”列。 user_id 是邀请者,friend_id 是接收者。请注意,当建立友谊时,我不会在数据库中创建 2 条记录,例如 1,2 和 2,1。

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

【问题讨论】:

  • 我的搭档正在测试 :)

标签: php mysql database social-networking


【解决方案1】:

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

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

【讨论】:

    【解决方案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 />";
    }

    【讨论】:

    • 它有效,但我们对 Archimedix 的方法感到好奇,稍后将投票选出最佳答案 :)
    • 这里只是一个问题。此查询每次返回朋友的 id 和我自己的 id。如果我有 200 个朋友,它会返回他们以及我 id 的 200 倍。
    • 你是什么意思? SELECT 语句中只有一个字段。
    • 感谢您的回答。
    【解决方案3】:

    我认为确保friends 表在user_id 列中始终具有较低的ID 而在另一列中具有较高的ID 可能是最简单的。
    这样,您就不需要检查两次,从而获得更好的性能。

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

    否则,请使用 UNION 查询,如 Joe 所说或使用 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 和基准找出来)。

    【讨论】:

    • 这种方法很有趣,但我们不太明白。你的意思是像2吗? 5, 2 | 4, 4 | 5 如果是这样,这如何排除第二次检查并简化查询?
    • Duh...抱歉,看起来我只是有一些奇怪的想法...忽略答案的第一部分,这也需要您存储反向关系(2 | 55 | 2) 并且需要额外的标志或额外的查询条件才能工作。然后,您将只获取表中user_id 小于friend_id 的那些关系,避免重复。但是,这可能并不比其他方法快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 2011-12-06
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多