从mysql获取随机好友

Posted

技术标签:

【中文标题】从mysql获取随机好友【英文标题】:Get random friends from mysql 【发布时间】:2013-11-18 11:51:29 【问题描述】:

那里有 2 个 mysql 表 users(id,name,city) 和friend_list(id,userid,friend,status)。

现在我需要从friend_list 表中随机获取三个朋友,并从users 表中获取他们的姓名。

Friend_list table
id |  userid  |friend |status
1  |    1     |   2   | friends
2  |    3     |   1   | friends
3  |    2     |   3   | friends

users table:
id  |  name
1   | xxx
2   | yyy
3   | zzz

我需要这样的查询。

SELECT f.*,u.name FROM friend_list f,users u WHERE (f.userid = 1 or f.friend = 1) AND f.status = 'friends' AND f.userid = u.id AND f.order by RAND() limit 3 

但例如:它应该在 userid 列和朋友列中选择 1。

我试图在不使用 JOIN 的情况下实现它

【问题讨论】:

你试过用rand()函数加入吗?? @rockieB :我使用 SELECT f.*,u.name FROM friend_list f,users u WHERE (f.userid = 1 or f.friend = 1) AND f.status = 'friends' AND f.userid = u.id AND f.order by RAND() limit 3 ` 但问题是从用户表中选择名称。如何将选定的行与用户表(f.userid = u.id)和(f.friend = u.id)的id列匹配? 【参考方案1】:

您可以使用 rand() 的排序,如下查询。

select Friend_list.friend,users.name from Friend_list inner join users on Friend_list.userid=users.id order by rand();

【讨论】:

【参考方案2】:

要选择 2 个随机条目,请尝试:

SELECT * FROM 
(
 SELECT * from users join on Friend_list.userid = users.id where users.id = ?
) as sub_equity
ORDER BY RAND() LIMIT 2

我在一个项目上有同样的任务:-)

【讨论】:

【参考方案3】:
SELECT Friend_list.*, users.name
FROM Friend_list INNER JOIN users ON Friend_list.userid = users.id
ORDER BY RAND()  // this will show random records

【讨论】:

【参考方案4】:

您可以使用ORDER BY RAND() LIMIT 3;

【讨论】:

【参考方案5】:

试试这个:

SELECT * FROM friend_list f
INNER JOIN users u ON u.id = f.userid
ORDER BY rand() LIMIT 1;

SQL FIDDLE:http://sqlfiddle.com/#!2/e483c/1/0

【讨论】:

【参考方案6】:

如果有很多行,ORDER BY RAND() 会很慢。

如果users.id 是连续的,并且您对 users.id 有统计信息(例如 MAX(users.id)、MIN(users.id)),则在客户端生成三个介于 min、max 之间的随机数。

以下查询:

SELECT u.name as person, u2.name as friend_with
FROM users u
INNER JOIN friends_list f ON u.id = f.userid
WHERE users.id IN (random_number1, 2, 3);

这个查询可以使用INDEX,所以比ORDER BY RAND()

啊.. users.id 不会是连续的(比如用户被删除了),所以你需要生成足够的随机数。

【讨论】:

【参考方案7】:

尝试这样做:

SELECT u.name as person, u2.name as friend_with
FROM users u
INNER JOIN friends_list f ON u.id = f.userid
INNER JOIN users u2 ON u2.id = f.friend
WHERE f.userid = 1 or f.friend = 1
AND f.status = 'friends'
ORDER BY rand() LIMIT 3;

SQLFIDDLE DEMO

这将为您获取三个随机记录,其中包含该人的姓名和他的朋友的姓名,作为用户 ID 1 之一

【讨论】:

我需要不使用联接的结果...查看我的编辑(在结果附近添加了查询)... 您的查询中有隐式连接。我只是明确地使用它们。我更改它以添加用户ID 1的验证。看看它是否是你想要的 如果表中有更多记录,是否会影响查询处理时间。超过 100k 或 1000k 条记录... Random 不是很快,但您最好根据您的数据对其进行测试,看看您是否可以使用它,或者您是否必须尝试不同的方法。

以上是关于从mysql获取随机好友的主要内容,如果未能解决你的问题,请参考以下文章

从mysql获取随机记录

MySQL实现随机获取几条数据的方法

如何从 Facebook iOS sdk 获取好友列表

MySQL随机获取数据的方法,支持大数据量

如何使用 Web 服务从 iPhone 版 Facebook 获取事件、生日、好友列表、事件?

个人微信Hook-开发SDK-C#Demo