2012-09-18 50 views
2

我有两张桌子,一张是regcourses,另一张是coursegroups。如何通过在mysql中连接两个表来更新一个表?

coursegroups表

CREATE TABLE coursesgroup (
    csgrec int(11) unsigned NOT NULL auto_increment, 
    courseID int(11) default NULL, 
    classID int(11) default NULL, 
    studgroup varchar(20) default NULL, 
    studnum int(11) default NULL, 
    PRIMARY KEY (csgrec) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

regcourses表:

CREATE TABLE regcourses (
    regrec int(11) unsigned NOT NULL auto_increment, 
    regsemrec int(11) default NULL, 
    regstudID int(11) default NULL, 
    regcourseID int(11) default NULL, 
    regstatus int(11) default '0', 
    yearsem int(11) default '2012', 
    monthsem1 int(11) default '3', 
    classID int(11) default '1', 
    PRIMARY KEY (regrec) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Insert语句:

INSERT INTO coursesgroup VALUES ('2', '20', '1', 'BBA1009A1', '11'); 
INSERT INTO coursesgroup VALUES ('3', '20', '1', 'BBA1009B1', '4'); 

INSERT INTO regcourses VALUES ('2', '1', '98', '47', '0', '2012', '3', '1'); 
INSERT INTO regcourses VALUES ('4', '1', '98', '101', '0', '2012', '3', '1'); 

我想将regcourses表的regstatus字段更新为“2”,以获取coursegroup表中csgrec列的特定值。所以我的更新代码是:

UPDATE regcourses JOIN coursesgroup ON regcourses.regcourseID = coursesgroup.courseID 
Set regcourses.regstatus =2 
WHERE coursesgroup.csgrec=3 

但我的查询影响很多行而不是一行。因为我只想更改csgrec = 3,并且我的查询会影响与regcourses.regcourseID = coursesgroup.courseID condition匹配的所有行。请帮助我。

回答

1

首先,运行此查询:

SELECT * FROM regcourses 
JOIN coursesgroup ON regcourses.regcourseID = coursesgroup.courseID 
WHERE coursesgroup.csgrec=3 

(这是基本相同的更新,无需做任何更新)会告诉你,如果你的加入是错误的;如果你匹配太多的行。

从您的insert陈述中,我看不到应该发生什么 - 从您显示的四行开始,没有任何内容符合该连接条件。尝试插入并查看首先返回多少行。

+0

谢谢你的回答。其实我在这里只显示了4行,但还有几个插入行。其中有共同的courseID。我已经使用group by子句尝试了Select查询,它的工作就像我需要的一样。查询是:SELECT * FROM regcourses WHERE regcourseID =(SELECT courseID FROM coursesgroup WHERE csgrec = 3) GROUP BY regcourseID 但我想在更新中使用group by子句。如何在更新中使用group by子句? – barsan

+0

为什么你需要'GROUP BY'?这可能会隐藏你的东西。即使数据库中有多行,这也会强制您的select仅返回每行regcourseid的一行。 –

+0

我也试过你的建议,它检索这么多输出行而不是1行。因为对于csgrec字段,只有一个'3'。但我仍然得到很多行。我怎样才能得到只有一行而不使用group by? – barsan