2012-06-15 57 views
0

我在數據庫中的表結構;從mysql數據庫中刪除複雜的值

表 「System_t」

id   | Owner  | System 
=========================================== 
1   | Joe  | Registration 
      |    | Event    //contains new line 
      |    | Aims 
------------------------------------------- 
2   | Rose  | Ticket 
      |    | Elearning 

注:數據域 「系統」 是從一個textarea箱保存。

我的問題是我如何刪除字段「系統」中的「事件」數據?

我的表格在刪除時應該看起來像這樣;

id   | Owner  | System 
=========================================== 
1   | Joe  | Registration 
      |    | Aims 
------------------------------------------- 
2   | Rose  | Ticket 
      |    | Elearning 

任何想法如何做到這一點而不改變表結構?

+0

「系統」列是否總是包含「事件」文本或者它是每個單元格中的不同事件名稱? – bendataclear

+0

然後,如果它是每個單元格中的不同文本,他肯定會用PHP來管理它,而不是MYSQL。 –

回答

5

UPDATE聲明以REPLACE應該是在這種情況下更好。

看看這個帖子,它可以幫助你明白我在說什麼:

Deleting part of a string in MYSQL

+0

其實,這比我的正則表達式回答好,因爲,正則表達式是不必要的固定字符串:-) + 1並刪除我的。 – paxdiablo

+1

是的,我雖然REGEX解決方案對於這種技巧有點複雜。但我必須補充一點,即使OP不想談論它,也應該檢查表格的結構。 –

+0

完美的作品。謝謝 –

0

你可以使用delete命令將其刪除:

DELETE FROM table_name 
WHERE some_column=some_value 
+0

不能這樣做,因爲它會刪除字段「系統」中的所有數據 –

+0

給我一分鐘。讓我找出另一種方式! – Jathin

0
$searchQuery = "Event"; 

$query = mysql_query("SELECT `id`, `System` FROM `System_t` WHERE `System` LIKE '%" . $searchQuery . "%'"); 

if (mysql_num_rows($query) > 0) { 
    while ($arr = mysql_fetch_row($query)) { 
     $system = explode("\n", $arr[1]); 
     $key = array_search($searchQuery, $system); 
     if ($key !== false) 
      unset($system[$key]); 

     $system = implode("\n", $system); 

     mysql_query("UPDATE `System_t` SET `System`='" . $system . "' WHERE `id`='" . $arr[0] . "'"); 
    } 
} 
+0

我從問題中讀到,「事件」行將是每行的唯一文本,而不僅僅是「事件」文本。 – bendataclear

+0

'mysql_ *'不應該再使用了。 – Shikiryu

+0

@bendataclear LIKE'%text%'即使在 – Ananth

0

試試這個:

update System_t su 
     set su.System = replace(su.System, "Event", "") 
     where su.System like "%Event%"; 

我還沒有采取新的線路兼顧我把這個留給你作爲一個簡單的練習:)。

0
Update system_t SET system=REPLACE(system,'event','') WHERE system REGEXP '[[:<:]]event[[:>:]]'; 
+0

只需注意tsabz提供了更好的解決方案。 – sel

0

對於PostgreSQL,你coud使用類似(因爲我相信沒有直接的替代功能在MySQL):

UPDATE "System_t" 
SET "System" = overlay("System" placing '' 
       from (position('Events' in "System")) 
       for 6) 
WHERE "System" LIKE '%Events%' 

你可以在這裏看到的覆蓋和位置功能的描述:http://www.postgresql.org/docs/8.0/static/functions-string.html

而6是您要移除的字符串的大小。

無論如何,我會建議你創建另一個表,例如(id,system_id,system_type),其中system_id是另一個表的外鍵。這樣,你會有一個更好的模型,並避免了很多不一致。