2012-06-22 30 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提取結果並拆分分隔符。 –