您可以使用下面的代码来生成列表:
select max(from_id) as from_id,
max(to_id) as to_id
from (
select
case when rownum mod 2 = 1 then user_id else null end as from_id,
case when rownum mod 2 = 0 then user_id else null end as to_id,
(rownum - 1) div 2 as pairnum
from (
select user_id, @rownum := @rownum + 1 as rownum
from
(select @rownum := 0) as init,
(select user_id from tbl_user order by rand()) as randlist
) as randlistrownum
) as randlistpairs
group by pairnum;
一步一步来,这样会:
- 顺序按随机顺序
- 的用户列表分配ROWNUMBER到它(否则命令将没有意义)
- 分配两个连续的行相同
pairnum
(rownum = 1
和rownum = 2
得到值pairnum = 0
,接下来的两行获得pairnum = 1
等)
- 这些成对的行中的第一行会得到一个值
from_id = user_id
和to_id = null
,另一列将是to_id = user_id
和from_id = null
group by
这些对在一起,使它们变成一排
- ,如果你有一个奇数数量的用户,一个用户将最终
to_id = null
,因为它没有伙伴
锂如果你喜欢短代码ttle更紧凑:中
select max(case when rownum mod 2 = 1 then user_id else null end) as from_id,
max(case when rownum mod 2 = 0 then user_id else null end) as to_id
from (
select user_id, @rownum := @rownum + 1 as rownum, (@rownum - 1) div 2 as pairnum
from
(select @rownum := 0) as init,
(select user_id from tbl_user order by rand()) as randlist
) as randlistpairs
group by pairnum;
可能的复制http://stackoverflow.com/questions/4823208/how-do-i-select-unique-pairs-of-rows-from-a-随机表 – Jagrati
由于您用'php'标记了它:在php中这样做。在mysql中这将是低效的。用数字1 ... max生成一个数组,使用例如[洗牌](http://php.net/manual/de/function.shuffle。php)并使用该数组填充配对表(数组中的第1个值是第1个'from_id',第2个值是第1个'to_id',第3个值是第2个'from_id'等等)。 – Solarflare
感谢@Solarflare的评论,但我想随机用户配对来自数据库的记录。随机配对很容易在PHP中设置,但我想从数据库选择查询。 –