2012-09-18 52 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