12 名球员随机参加为期 3 天的高尔夫小组

问题描述 投票:0回答:1

我开始为我的一个小型副项目开发基于 CTE 的 MySQL 脚本......那就是,在 3 天的时间里,从 12 名玩家组成的小组中确定,每组 4 人,这样就没有玩家可以玩同一个玩家两次。进一步解释:

第一天。我会和玩家 2、3 和 4 一起玩。

第二天。我会和 12、11 和 10 号玩家一起玩。

第三天。我会和 6、7、8 号玩家一起玩。

当然,这些玩家 ID 是随机的,但我希望你能明白要点。

对于玩家 2 来说也是如此。第一天他们和我一起玩,但是第 2 天和第 3 天他们的游戏组中会有不同的人。

我的代码/思维太基础了 - 遵循以下几行:

WITH Base_cte (select IDs of 12 people)
, D1T1 as (Select PlayerId, RAND() FROM Base Order by 2 LIMIT 4)
, D1T2 as (Select PlayerId, RAND() FROM Base (where not in D1T1) Order by 2 LIMIT 4)
, D1T3 as (Select PlayerId, RAND() FROM Base (where not in D1T1 or D1T2) Order by 2 LIMIT 4)
, 
SELECT 'Day1 Grp1' as Lbl, Player FROM D1T1 UNION 
SELECT 'Day1 Grp2', Player FROM D1T2 UNION 
SELECT 'Day1 Grp3', Player FROM D1T3

但这给了我一个很棒的第一天——然后我就无话可说去尝试第二天了。有人可以帮忙吗?

mysql unique
1个回答
0
投票

您可以在 MySQL 中使用递归公共表表达式 (CTE) 来实现三天内为 12 名玩家建立组的预期结果,这样就不会再与同一玩家一起玩。这允许您每天创建组,同时保证没有参与者重复。这是一个可以帮助您的脚本:

-- Create a table to hold the player IDs
CREATE TEMPORARY TABLE IF NOT EXISTS Players (
    PlayerID INT
);

-- Insert your 12 player IDs into the table (replace with your actual player IDs)
INSERT INTO Players (PlayerID) VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12);

-- Recursive CTE to form groups for 3 days
WITH RECURSIVE GroupAssignment AS (
    SELECT 1 AS Day, 1 AS GroupNumber, PlayerID FROM Players WHERE PlayerID = 1
    UNION ALL
    SELECT
        CASE
            WHEN g.Day = 1 AND g.GroupNumber = 4 THEN 2
            WHEN g.Day = 2 AND g.GroupNumber = 4 THEN 3
            ELSE g.Day
        END AS Day,
        CASE
            WHEN g.GroupNumber = 4 THEN 1
            ELSE g.GroupNumber + 1
        END AS GroupNumber,
        p.PlayerID
    FROM
        GroupAssignment g
    JOIN Players p
    ON
        g.PlayerID <> p.PlayerID
    WHERE
        g.Day < 3  -- Set the number of days here
)
-- Select the final result
SELECT
    CASE
        WHEN ga.Day = 1 THEN 'Day1'
        WHEN ga.Day = 2 THEN 'Day2'
        ELSE 'Day3'
    END AS DayLabel,
    CONCAT('Group', ga.GroupNumber) AS GroupLabel,
    GROUP_CONCAT(ga.PlayerID ORDER BY ga.PlayerID) AS GroupMembers
FROM
    GroupAssignment ga
GROUP BY
    ga.Day,
    ga.GroupNumber;

为了保存玩家 ID,我们构建了一个名为

Players
的临时表。您应该用示例数据替换您自己的玩家 ID。我们采用名为
GroupAssignment
的递归 CTE 来构建每天的组,确保没有参与者与同一个人玩两次。递归部分继续将玩家添加到组中,同时遵守限制。最后一个
SELECT
语句排列结果并指定日期标签和组标签。您可以通过将递归 CTE 中的条件
g.Day 3
更改为适当的天数来更改天数。

© www.soinside.com 2019 - 2024. All rights reserved.