2014-07-24 51 views
2

我正在使用MYSQL数据库处理PHP项目。我有一组学生表。每个小组都有一名考官。我想要做的是我想为每个组随机设置两名考官。怎么做?将数组中的随机值设置为数据库

MySQL代码:

create table groups (
    groupID    int(10)    not null, 
    nbStudents   int     not null, 
    avgGPA    DOUBLE    NOT NULL, 
    projectName   varchar(50)   not null, 
    advisorID   int,     
    examiner1ID   int,  
    examiner2ID   int, 
    adminID    int     not null, 
    primary key (groupID) 
); 

create table faculty (
    name    varchar(30)   not null, 
    facultyID   int(10)     not null, 
    email    varchar(30)   not null, 
    mobile    int(15)    not null,    
    primary key (facultyID) 
); 

examiner1IDexaminer2ID是从表中的教师外键。

+0

修改您的样本数据和所希望的结果的问题。 –

+0

当你在它的时候抛出一些源代码 – Deryck

+0

你有Examiners表吗? –

回答

1

这是一个非常复杂的方式来做到这一点。它使用2个子查询来挑选教师成员,并使用insert .. on duplicate key来更新考官ID。

insert into groups 
(groupID, examiner1ID, examiner2ID) 
select groupID, 
    @x:=(select facultyID from faculty order by rand() limit 1), 
    (select facultyID from faculty where facultyID <> @x order by rand() limit 1) 
from groups 
on duplicate key update examiner1ID=values(examiner1ID), examiner2ID=values(examiner2ID); 

@xuser-defined-variable。在这种情况下,它被用来存储第一个随机的教员。 <> @x确保我们不会在两个插槽中选择相同的教员。

由于groupID是一个唯一的键,当我们尝试插入一个具有现有唯一键的行时,它将更新现有的行而不是插入它。这就是on duplicate key update子句的用法。对于每个组

设置不同的审查员:

insert into groups 
(groupID, examier1ID, examier2ID) 
select a.groupID, max(if(b.id%2, b.facultyID, 0)), max(if(b.id%2, 0, b.facultyID)) 
from (
    select @row:[email protected]+1 id, groupID 
    from groups a 
    join (select @row:=0) b) a 
join (
    select @row:[email protected]+1 id, facultyID 
    from (
     select facultyID 
     from faculty a 
     order by rand()) a 
    join (select @row:=0) b) b on a.id = ceil(b.id/2) 
group by a.groupID 
on duplicate key update examiner1ID=values(examiner1ID), examiner2ID=values(examiner2ID); 
+0

谢谢。你能解释一下你刚刚做了什么吗?什么是@x:和<>?重复密钥是什么? – hzjw

+0

谢谢老兄。最后一件事。如何为每个组设置不同的审查员?没有重复。谢谢。 – hzjw

+0

@hzjw,你的意思是同一个教员不能被分配到多个组? – Fabricator