2012-06-22 32 views
0

我有以下数据库结构。mysql中的Concat和Concat_ws

ID | Name | Marks 

我试图在我的PHP脚本中插入记录。如果记录不存在,我将创建一个新记录。如果它存在,我用新标记连接标记列。

$strSQL = "Replace into student set ID = '".$id."', 
       name = '".$name."', marks= CONCAT_WS(',',Marks,'".$marks."')"; 

查询运行正常,但concat不起作用。旧记录正在被新记录覆盖。我也试过CONCAT

感谢

+0

请勿创建逗号分隔值列。稍后当你需要报告时,你会后悔的。相反,创建另一个表,其中存储与你的学生表一对多的“ID,Marks”。 –

+0

我看到你在说什么。我可以有其他一些分隔符,如'|'。 – Ank

+0

任何分隔符都有问题。这些属于一个单独的规范化表格。 –

回答

1

来处理这个正确的方法是用一个单独的标准化表格拿着学生证和标志。使用INSERT IGNORE将学生信息插入到student表中,然后将标记插入marks表中,每个学生多行。这也允许您存储日期以及添加到表格中的每个标记或其他信息(如它所属的课程)。请注意,我通常不建议使用INSERT IGNORE来创建一行,但是如果该行存在,则首先检查代码,如果不存在,则仅插入。

CREATE TABLE marks (
    markID INT NOT NULL PRIMARY KEY AUTO_INCREMENT, 
    studentID INT NOT NULL, 
    mark VARCHAR() NOT NULL, 
    markdate DATETIME NOT NULL 
); 

/* First execute the insert, which will ignore errors if it already exists */ 
INSERT IGNORE INTO student (ID, name) VALUES ($id, '$name'); 

/* Then insert the new marks. Loop to add as many new marks as needed */ 
INSERT INTO marks (studentID, mark, markdate) VALUES ($id, '$marks', NOW()); 
+0

谢谢..但我不知道每个学生有多少分数。学生A可能有3分。在那种情况下,我会做A 2 | 3 | 4,而学生B可能会有2分。在那种情况下,我会做B 2 | 3。 (假设'|'是分隔符)。如果我稍后尝试添加更多标记,则插入将失败。 – Ank

+0

我想将标记列与每个学生的新标记连接起来 – Ank

+0

@Ankur标准化表的一点是,您可以添加尽可能多的添加项。如果连接它们,将永远无法从数据库中有效地进行查询。相反,你必须始终使用PHP提取结果并拆分分隔符。 –