用mysql删除其他行

时间:2013-01-29 11:00:45

标签: javascript mysql sql

我有一个包含表格的数据库。

create table student (
    stu_code integer,
    stu_name varchar(32),
    primary key (stu_code)
)
create table teacher (
    tea_code integer not null,
    tea_name varchar(25),
    primary key (tea_code)
)
create table course (
    cor_code integer not null,
    cor_name varchar(32),
    salary float(32),
    unit integer,
    primary key (cor_code)
)
create table term (
    stu_code integer,
    cor_code integer,
    tea_code integer,
    grade decimal(25),
    year integer,
)

我手动填写了三张表。

术语表由Javascript代码生成:

<html>
<body>
<div id="rnd"></div>
<script type="text/javascript">
    function rnd(a,b){
        return Math.floor(Math.random()*(b-a+1))+a;
    }
    for (var i=0;i<600;i++) {
        var stu = rnd(41,49),
        cor     = rnd(10,26),
        tea     = rnd(81,90),
        year    = rnd(1391,1392),
        grade   = rnd(8,20);
        (year==1392)?grade = null:true;
        document.writeln(
            "insert into term (stu_code,cor_code,tea_code,grade,year) values "
            +"(884221"              +stu+","
            +"180"                  +cor+","
            +"15120"                +tea+","
            +grade                  +"," 
            +year
            +");"
            +"<br>"
        );
    }
</script>
</body>
</html>

我的问题是术语表中还有其他行。

如何整合/删除其他行?

有没有办法填充表格而没有额外的随机行?

/ * update:* /

例如:

insert into term (s,c,t,g) values (45,16,88,16,91);
insert into term (s,c,t,g) values (45,16,86,10,91);
insert into term (s,c,t,g) values (45,16,87,8,91);
insert into term (s,c,t,g) values (41,15,85,20,91);
insert into term (s,c,t,g) values (41,15,88,17,91);

现在我要显示:

insert into term (s,c,t,g) values (45,16,88,16,91);
insert into term (s,c,t,g) values (41,15,85,20,91);
or 

insert into term (s,c,t,g) values (45,16,88,16,91);
insert into term (s,c,t,g) values (41,15,88,17,91);
or

insert into term (s,c,t,g) values (45,16,86,10,91);
insert into term (s,c,t,g) values (41,15,85,20,91);
or 

insert into term (s,c,t,g) values (45,16,86,10,91);
insert into term (s,c,t,g) values (41,15,88,17,91);
or

insert into term (s,c,t,g) values (45,16,87,8,91);
insert into term (s,c,t,g) values (41,15,85,20,91);
or 

insert into term (s,c,t,g) values (45,16,87,8,91);
insert into term (s,c,t,g) values (41,15,88,17,91);

/ *结束更新* /

/ *再次更新* /

我可以在Sql Server中编写代码 但是这段代码在Mysql中不起作用么? Mysql中这段代码的等价物是什么?

delete  from  term
where  stu_code in(
select  stu_code
from  term
group  by  stu_code,cod_code,year
having  COUNT(stu_code)>=2

/ *结束上次更新* /

请帮我解决这个问题!

谢谢:x

2 个答案:

答案 0 :(得分:1)

假设每个学生都可以报名参加多门课程,每个学生只能参加一门课程。

由于您只有学生[41,49]和课程[10,26],因此最多有9 * 17 = 153种组合。

我会这样做:

<html>
<body>
<div id="rnd"></div>
<script type="text/javascript">
    function rnd(a,b){
        return Math.floor(Math.random()*(b-a+1))+a;
    }
    for (var stu = 41; stu <= 49; stu++) {
        for (var cor = 10; cor <= 26; cor++) {
            tea   = rnd(81,90);
            year  = rnd(1391,1392);
            grade = rnd(8,20);
            (year==1392)?grade = null:true;
            document.writeln(
                "insert into term (stu_code,cor_code,tea_code,grade,year) values "
                +"(884221"              +stu+","
                +"180"                  +cor+","
                +"15120"                +tea+","
                +grade                  +"," 
                +year
                +");"
                +"<br>"
            );
        }
    }
</script>
</body>
</html>

有关您的更新部分

假设您希望保留记录的最小值year

DELETE a FROM 
    term a JOIN term b 
    ON (a.stu_code = b.stu_code AND a.cod_code = b.cod_code AND a.year > b.year)

所以这个查询的作用是查找并删除所有重复的行,并在左侧放置一个更大的year

答案 1 :(得分:0)

delete  from  term
where  stu_code in(
select  stu_code
from  term
group  by  stu_code,cod_code,year
having  COUNT(stu_code)>=2
  

我认为该查询的问题在于它将全部删除   stu_codes,如果stu_code&gt; = 2,甚至没有一个副本。你想   如果有多份副本,请保留1份。