【问题标题】:SELECT a column then INSERT that column again randomly选择一列,然后再次随机插入该列
【发布时间】:2016-05-14 14:17:29
【问题描述】:

我有一张桌子:

player_id|player_name|play_with_id|play_with_name|

我为游戏制作了这张桌子。

想玩的人都可以报名参加。

当他们注册时,表格存储 player_id 和 player_name

当他们可以注册的期限到期时,我想将每个 player_name 随机分配给 play_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      -                 -

【问题讨论】:

  • 为什么someone5没有匹配到任何人?
  • 我想是因为没有人了。玩家 1-4 已经互相占用了。
  • 您最好在应用程序/“业务层”中随机分配玩家而不是 SQL。我试图组合一个查询来执行此操作,以防万一您需要在 SQL 中执行此操作,但不幸的是,我无法从 SQL Fiddle 中获得响应,而且我目前没有可用的 MySQL。跨度>
  • @PerlDog 但它们不一定是,假设匹配实际上是随机的,而不是成对的
  • 您通常不会同时存储名称和 ID(除了在播放器表中)

标签: mysql sql random


【解决方案1】:

我无法对此进行测试,因为我手边没有 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() 并生成新值结果集中的每一行。

【讨论】:

    【解决方案2】:

    我不确定为什么某些客户端代码不执行此操作,而不是在数据库级别执行此操作,但我想如果您从 @ 获取基于您的数据库检索随机行集的策略987654321@,然后您可以编写一个带有游标或迭代器的存储过程来循环遍历结果集,例如:

    select player_id, player_name from players order by RAND()
    

    然后循环遍历所有表行以更新 play_with_id 和 play_with_name,其中之前选择的 player_id play_with_id。

    【讨论】:

    • 数据库在他的问题中被标记:mysql。
    • 啊,原来如此。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 2018-03-24
    • 1970-01-01
    • 2015-01-26
    • 2017-05-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多