Php 从表中随机选择唯一的用户对

Php 从表中随机选择唯一的用户对,php,mysql,sql,database,codeigniter,Php,Mysql,Sql,Database,Codeigniter,我想在数据库用户之间创建随机用户对 我有以下用户表: 表:tbl_用户 我想生成这样一个随机结果: from_id | to_id --------+--------- 1 | 6 5 | 3 2 | 4 $grouping = {}; // Fetching both rows to ensure that we actually have an even number paired up. while ($row = $res->fetch_

我想在数据库用户之间创建随机用户对

我有以下用户表:

表:tbl_用户

我想生成这样一个随机结果:

from_id | to_id
--------+---------
1       | 6 
5       | 3 
2       | 4 
$grouping = {};
// Fetching both rows to ensure that we actually have an even number paired up.
while ($row = $res->fetch_array () && $row2 = $res->fetch_array ()) {
    $grouping[] = {$row['name'], $row2['name']};
}

这只能在MySQL中完成吗?

这确实是的副本,因此答案就在那里

然而,即使在MySQL中确实可以这样做,也不推荐这样做。PHP是处理这个问题的更好的工具,因为您所做的实际上是根据一些业务规则操作数据。在PHP中进行维护会容易得多,而且我怀疑它的资源密集度也会降低

一种可能的方法,我更喜欢。就是在SQL中进行随机排序,然后将两行和两行配对。大概是这样的:

from_id | to_id
--------+---------
1       | 6 
5       | 3 
2       | 4 
$grouping = {};
// Fetching both rows to ensure that we actually have an even number paired up.
while ($row = $res->fetch_array () && $row2 = $res->fetch_array ()) {
    $grouping[] = {$row['name'], $row2['name']};
}

如果要允许列出不匹配的用户,只需将第二个fetch移动到循环内部。然后处理可能丢失的结果。

您可以使用以下代码生成列表:

选择maxfrom\u id作为from\u id, maxto_id作为to_id 从…起 选择 当rownum mod 2=1时,则用户\u id else null结束为from\u id, 当rownum mod 2=0时,则用户\u id else null结束为\u id, rownum-1第2部分作为pairnum 从…起 选择用户标识@rownum:=@rownum+1作为rownum 从…起 选择@rownum:=0作为初始值, 从tbl_user order by rand中选择用户id作为randlist 作为randlistrownum 成对的 按配对分组; 逐步地,这将:

按随机顺序排列用户列表 为其指定一个行号,否则该顺序将没有意义 将相同的pairnum rownum=1和rownum=2分配给两个连续的行,获得pairnum=0的值,接下来的两行将获得pairnum=1,依此类推 这些成对行中的第一行将获取来自\u id=user\u id和to\u id=null的值,另一行将是to\u id=user\u id和from\u id=null的值 将这些对组合成一行 如果用户数量为奇数,则一个用户将以to_id=null结束,因为它没有合作伙伴 如果您更喜欢较短的代码,请稍微紧凑一些:

当rownum mod 2=1时选择maxcase,然后选择user_id else null end as from_id, 当rownum mod 2=0时,则用户\u id else null结束 从…起 选择用户id,@rownum:=@rownum+1作为rownum,@rownum-1 div 2作为pairnum 从…起 选择@rownum:=0作为初始值, 从tbl_user order by rand中选择用户id作为randlist 成对的 按配对分组;
可能重复的,因为您用php标记了它:在php中这样做。在mysql中,这将是低效的。生成一个数字为1…max的数组,使用该数组填充配对表。数组中的第一个值是从\u id开始的第一个值,第二个值是从\u id开始的第一个值,第三个值是从\u id开始的第二个值,依此类推。感谢@Solarflare的评论,但我希望随机用户从数据库中配对记录。在php中很容易设置随机配对,但我想从数据库中选择查询。