Php 每周编制年度工作表,不连续工作两周

Php 每周编制年度工作表,不连续工作两周,php,mysql,sql,Php,Mysql,Sql,我们学院有6名法官和4名专家会见我们的外宾。4名专家与6名法官合作帮助他们。在“家长id”列中,显示与评委合作的每位专家。我想每周准备一份年度工作表。因此,首先我准备了一个用户表,如下图所示。用户表 我不希望法官和专家连续两周被指派。所以我编写了一个foreach循环并创建了52周。后来我把法官的名字一个名字一个名字地插入其中。这是我的密码 $judge_list = array(); $judge_ids = array(); // Retrieve all results from use

我们学院有6名法官和4名专家会见我们的外宾。4名专家与6名法官合作帮助他们。在“家长id”列中,显示与评委合作的每位专家。我想每周准备一份年度工作表。因此,首先我准备了一个用户表,如下图所示。用户表 我不希望法官和专家连续两周被指派。所以我编写了一个foreach循环并创建了52周。后来我把法官的名字一个名字一个名字地插入其中。这是我的密码

$judge_list = array();
$judge_ids = array();
 // Retrieve all results from users table which mission is judge.
$judges = $db->get_results("SELECT * FROM users WHERE mission='judge'");
// How many times we must repeat to reach 52? Because a year has got 52 weeks.
$repeat =  ceil(52/count($judges)); 
// Until it reaches min. 52 returns first names and last names of the judges. 
for ($i=1; $i<=$repeat; $i++) foreach ($judges as $judge) $judge_list[] = $judge["first_name"] . ' ' . $judge["last_name"];
// Until it reaches min. 52 returns id numbers of the judges. 
for ($i=1; $i<=$repeat; $i++) foreach ($judges as $judge) $judge_ids[] = $judge["id"];
// Make a new array which contains judge's names, surnames and ids. Than get first 52.
$array = array_slice(@array_map(null, $judge_ids, $judge_list), 0, 52);
// Before insert new datas, truncate table.
$db->truncate("scale");
$x = 1;
// And last, insert into annual working scale table.
foreach ($array as $judg){
    $db->insert("scale", array('week' => $x, 'judge_id' => $judg[0], 'judge_name' => $judg[1]));
    $x++;
}
它的形状是这样的。专家表


现在问题来了:我想和专家一起更新比例表。专家们不应该连续工作两周。但我没有成功。请您帮助我,我如何编写sql查询代码?

这可以通过简单的枚举和模运算符来解决。这种方法没有考虑到其他因素,比如满足某个级别的专家的工作频率,但这是解决问题的开始,不管怎样,您似乎是通过任意枚举的方式来解决这个问题的。此查询每周返回1行1-52,每周返回一位法官和一位专家,并在编辑时链接到该法官:并保证不会在两个级别上连续两周重复同一个人。这利用两个独立递增的用户变量来枚举相关人员,然后通过模运算符和专家的父_id=判断id将其加入周数的选择。结果显示。where子句中的状态和内部查询中使用的计数用于处理大于或小于给定样本的数据,并将根据此表中人员的添加或删除或非“活动”状态自动调整计划。这是基于存在一个表weeks的假设,该表有52行,其中id从1到52。包围和最后的左连接用于奇数情况,其中当前法官和专家序列不匹配,并且第一个序列匹配无法选择专家,因此我们再次运行它,并将第二个结果限制在前几周或后几周内。在试验台条件下,这为52排提供了每排一名专家,没有一名专家或法官连续工作两周。日程安排可能需要做一些调整,例如,由于前面提到的奇怪之处,ID为11的专家不能经常安排工作

select WeekNum, JudgeID, Judge_first_name, Judge_last_name, coalesce(SpecialistID, s.id) AS SpecialistID, coalesce(Specialist_first_name, s.first_name) AS Specialist_first_name, coalesce(Specialist_last_name, s.last_name) AS Specialist_last_name
from (
    select w.id AS WeekNum, j.id AS JudgeID, j.first_name as Judge_first_name, j.last_name as Judge_last_name
      , s.id As SpecialistID, s.first_name as Specialist_first_name, s.last_name as Specialist_last_name
    from weeks w
      inner join (
        select @judgeNum:=@judgeNum + 1 AS JudgeNum, id, first_name, last_name, (select count(id) from users where mission = 'judge' and status = 'active') AS NumJudges
        from users
          join (select @judgeNum:=0) n
        where mission = 'judge'
          and status = 'active'
      ) j on (w.id % j.NumJudges) + 1 = j.JudgeNum
      left join (
        select SpecialistNum, s.id, cast(substring_index(substring_index(parent_id,',',w.id),',',-1) AS unsigned) AS JudgeID, first_name, last_name, NumSpecialists
        from (
            select @specialistNum:=@specialistNum + 1 AS SpecialistNum, id, parent_id, first_name, last_name, (select count(id) from users where mission = 'specialist' and status = 'active') AS NumSpecialists
            from users
              join (select @specialistNum:=0) n
            where mission = 'specialist'
              and status = 'active'
          ) s
          join weeks w on w.id <= length(s.parent_id) - length(replace(s.parent_id,',','')) + 1
      ) s on s.JudgeID = j.id
        and (w.id % s.NumSpecialists) + 1 = s.SpecialistNum
    ) t
    left join (
        select *
        from users u
        where mission = 'specialist'
            and status = 'active'
    ) s on t.specialistID IS NULL
        AND s.parent_id rlike '/[^\d]' + t.JudgeID + '[^\d]/'
where s.id is null or s.id not in (
    select c.id As SpecialistID
    from weeks w2
        inner join (
            select @judgeNum:=@judgeNum + 1 AS JudgeNum, id, first_name, last_name, (select count(id) from users where mission = 'judge' and status = 'active') AS NumJudges
            from users
              join (select @judgeNum:=0) n
            where mission = 'judge'
                and status = 'active'
        ) j on (w2.id % j.NumJudges) + 1 = j.JudgeNum
        left join (
            select SpecialistNum, c.id, cast(substring_index(substring_index(parent_id,',',w3.id),',',-1) AS unsigned) AS JudgeID, first_name, last_name, NumSpecialists
            from (
                select @specialistNum:=@specialistNum + 1 AS SpecialistNum, id, parent_id, first_name, last_name, (select count(id) from users where mission = 'specialist' and status = 'active') AS NumSpecialists
                from users
                  join (select @specialistNum:=0) n
                where mission = 'specialist'
                  and status = 'active'
              ) c
              join weeks w3 on w3.id <= length(c.parent_id) - length(replace(c.parent_id,',','')) + 1
        ) c on c.JudgeID = j.id
        and (w2.id % c.NumSpecialists) + 1 = c.SpecialistNum
    where w2.id in (t.WeekNum-1, t.WeekNum+1)
)
order by weeknum
;

您尝试过哪些SQL语句?我将在明天早上添加。现在我关闭了我的电脑。问题还不清楚。连续两周是什么意思?先把你的工作安排好。对不起,我的英语太差了。这不是我的母语。例如,如果在3中指定了专家。本周,我们不能在第4节中分配任务。周。首先非常感谢。我想,我找不到谷歌搜索。当然,我没有找到。对不起。。。我想奖励我的赏金,但我遇到了这样一个错误:你可以在4小时内奖励你的赏金。。但是页面上没有关于这种情况的信息。如果你再次回复,我将尝试奖励。对不起,时间不一样。如果我想在.Net中使用此SQL从MS Access检索数据,它可以工作吗?我试过了,但还是出错了。我不明白。你的问题被标记为mysql,因此我使用的是mysql语法。MS-Access背后的引擎JetSQL与其他SQL语言有很大的不同。您的问题是否被错误标记为MySQL?它应该被标记为MS Access吗?首先,我编码了PHP和MySQL。但后来,在我看到了这种可能性之后,再次非常感谢你们,我决定在Ado.Net、C&MSAccess.accdb上创建相同的结构。我不知道,MySQL和MsSQL两个平台都需要不同的SQL结构。当我看到你给出的代码工作正常时,我没有注意。但质疑是错误的。因为3,10,15,22,27,34,39,46,51。周未列出。你能帮我吗?
select WeekNum, JudgeID, Judge_first_name, Judge_last_name, coalesce(SpecialistID, s.id) AS SpecialistID, coalesce(Specialist_first_name, s.first_name) AS Specialist_first_name, coalesce(Specialist_last_name, s.last_name) AS Specialist_last_name
from (
    select w.id AS WeekNum, j.id AS JudgeID, j.first_name as Judge_first_name, j.last_name as Judge_last_name
      , s.id As SpecialistID, s.first_name as Specialist_first_name, s.last_name as Specialist_last_name
    from weeks w
      inner join (
        select @judgeNum:=@judgeNum + 1 AS JudgeNum, id, first_name, last_name, (select count(id) from users where mission = 'judge' and status = 'active') AS NumJudges
        from users
          join (select @judgeNum:=0) n
        where mission = 'judge'
          and status = 'active'
      ) j on (w.id % j.NumJudges) + 1 = j.JudgeNum
      left join (
        select SpecialistNum, s.id, cast(substring_index(substring_index(parent_id,',',w.id),',',-1) AS unsigned) AS JudgeID, first_name, last_name, NumSpecialists
        from (
            select @specialistNum:=@specialistNum + 1 AS SpecialistNum, id, parent_id, first_name, last_name, (select count(id) from users where mission = 'specialist' and status = 'active') AS NumSpecialists
            from users
              join (select @specialistNum:=0) n
            where mission = 'specialist'
              and status = 'active'
          ) s
          join weeks w on w.id <= length(s.parent_id) - length(replace(s.parent_id,',','')) + 1
      ) s on s.JudgeID = j.id
        and (w.id % s.NumSpecialists) + 1 = s.SpecialistNum
    ) t
    left join (
        select *
        from users u
        where mission = 'specialist'
            and status = 'active'
    ) s on t.specialistID IS NULL
        AND s.parent_id rlike '/[^\d]' + t.JudgeID + '[^\d]/'
where s.id is null or s.id not in (
    select c.id As SpecialistID
    from weeks w2
        inner join (
            select @judgeNum:=@judgeNum + 1 AS JudgeNum, id, first_name, last_name, (select count(id) from users where mission = 'judge' and status = 'active') AS NumJudges
            from users
              join (select @judgeNum:=0) n
            where mission = 'judge'
                and status = 'active'
        ) j on (w2.id % j.NumJudges) + 1 = j.JudgeNum
        left join (
            select SpecialistNum, c.id, cast(substring_index(substring_index(parent_id,',',w3.id),',',-1) AS unsigned) AS JudgeID, first_name, last_name, NumSpecialists
            from (
                select @specialistNum:=@specialistNum + 1 AS SpecialistNum, id, parent_id, first_name, last_name, (select count(id) from users where mission = 'specialist' and status = 'active') AS NumSpecialists
                from users
                  join (select @specialistNum:=0) n
                where mission = 'specialist'
                  and status = 'active'
              ) c
              join weeks w3 on w3.id <= length(c.parent_id) - length(replace(c.parent_id,',','')) + 1
        ) c on c.JudgeID = j.id
        and (w2.id % c.NumSpecialists) + 1 = c.SpecialistNum
    where w2.id in (t.WeekNum-1, t.WeekNum+1)
)
order by weeknum
;