我有一个名为' 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;用来获取我所有朋友的名字。
答案 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
)或IN
(JOIN ... ON u.user_id IN (friends.user_id, friends.friend_id)
)进行加入是昂贵的操作(使用EXPLAIN
和基准来找出)。