2016-02-04 59 views
2

我有一个表:选择一列,然后插入该列再次随机

player_id|player_name|play_with_id|play_with_name| 

我做了这个表的游戏。

每个想玩的人都可以注册。

当他们注册的表存储player_idplayer_name

当,而他们可以注册期满我要分配每个player_nameplay_with_name随机。

因此,例如..我的结构会喜欢这个,当他们在注册期限:

player_id|player_name|play_with_id|play_with_name| 
1   someone1 
2   someone2 
3   someone3 
4   someone4 
5   someone5 

这期间届满时:

player_id|player_name|play_with_id|play_with_name| 

    1  someone1  2    someone2 
    2  someone2  1    someone1 
    3  someone3  4    someone4 
    4  someone4  3    someone3 
    5  someone5  -     - 
+0

为什么'someone5'与任何人都不匹配? – Blorgbeard

+0

我想是因为没有人离开。玩家1-4已经互相占据了。 – PerlDuck

+1

您可能更适合在应用程序中随机分配玩家/“业务层”而不是SQL。为了防止需要在SQL中执行此操作,我试图组合一个查询来执行此操作,但不幸的是,我无法从SQL Fiddle中获得响应,此刻我也没有提供MySQL。 –

回答

2

我不能对此进行测试,因为我没有一个MySQL数据库方便和SQLFiddle似乎采取永远运行任何东西,但这个希望让你有或至少接近:

SET @row_num = 0; 
SET @last_player_id = 0; 

UPDATE P 
SET 
    play_with_id = 
     CASE 
      WHEN P.player_id = SQ.player_id THEN SQ.last_player_id 
      ELSE player_id 
     END 
FROM 
    Players P 
LEFT OUTER JOIN 
(
    SELECT 
     @row_num := @row_num + 1 row_num, 
     @last_player_id last_player_id, 
     @last_player_id := player_id player_id 
    FROM 
     Players 
    WHERE 
     MOD(@row_num, 2) = 0 
    ORDER BY 
     RAND() 
) SQ ON SQ.player_id = P.player_id OR SQ.last_player_id = P.player_id 

代码(希望)随机排列玩家,然后根据该顺序将它们配对。随机排序结果中的每个其他玩家都与之前的人员配对。

在MS SQL Server RAND()只会在这里一次评估,也不会落得影响ORDER BY,但我认为 MySQL的处理RAND()不同,产生的结果集中各行的新值。

0

我不知道为什么有些客户端代码不是这样做的,而不是在数据库级完成此操作,但是我想如果你从here获得基于DB的检索随机行集的策略,则可以使用游标编写存储过程或迭代器循环遍历结果设定的是这样的:

select player_id, player_name from players order by RAND() 

,然后循环通过所有表中的行,以更新play_with_id和play_with_name,其中所述之前选择的player_id <> play_with_id。

+0

数据库在他的问题中标记为:mysql。 –

+0

啊,就这样。谢谢。 – Dave

相关问题