从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获取随机好友的主要内容,如果未能解决你的问题,请参考以下文章