2010-11-17 25 views
2

我有一箇舊的數據庫與一個極大的記錄(或多或少)具有單個標籤欄(與標籤被管道分隔),看起來像這樣:如何拆分Pipe-Delimited列並將每個值插入到新表中一次?

Breakfast 
    Breakfast|Brunch|Buffet|Burger|Cakes|Crepes|Deli|Dessert|Dim Sum|Fast Food|Fine Wine|Spirits|Kebab|Noodles|Organic|Pizza|Salad|Seafood|Steakhouse|Sushi|Tapas|Vegetarian 
    Breakfast|Brunch|Buffet|Burger|Deli|Dessert|Fast Food|Fine Wine|Spirits|Noodles|Pizza|Salad|Seafood|Steakhouse|Vegetarian 
    Breakfast|Brunch|Buffet|Cakes|Crepes|Dessert|Fine Wine|Spirits|Salad|Seafood|Steakhouse|Tapas|Teahouse 
    Breakfast|Brunch|Burger|Crepes|Salad 
    Breakfast|Brunch|Cakes|Dessert|Dim Sum|Noodles|Pizza|Salad|Seafood|Steakhouse|Vegetarian 
    Breakfast|Brunch|Cakes|Dessert|Dim Sum|Noodles|Pizza|Salad|Seafood|Vegetarian 
    Breakfast|Brunch|Deli|Dessert|Organic|Salad 
    Breakfast|Brunch|Dessert|Dim Sum|Hot Pot|Seafood 
    Breakfast|Brunch|Dessert|Dim Sum|Seafood 
    Breakfast|Brunch|Dessert|Fine Wine|Spirits|Noodles|Pizza|Salad|Seafood 
    Breakfast|Brunch|Dessert|Fine Wine|Spirits|Salad|Vegetarian 

有沒有辦法一個可以檢索各標記並將其插入僅使用MySQL的新表tag_id | tag_nm

+0

的值是管道分隔? – 2010-11-17 04:45:49

+0

是的,這代表了20個collumns中的一個 – Moak 2010-11-17 04:46:52

+0

你不能只是獲取數據,例如,使用PHP的str_replace()並生成轉儲文件? – 2010-11-17 04:50:14

回答

1

發現後沒有正式的分裂功能我已經解決了使用MySQL的只有像這樣的問題:

1:我創建了功能strSplit

CREATE FUNCTION strSplit(x varchar(21845), delim varchar(255), pos int) returns varchar(255) 
return replace(
replace(
substring_index(x, delim, pos), 
substring_index(x, delim, pos - 1), 
'' 
), 
delim, 
'' 
); 

其次,我插入新將標籤粘貼到我的新表中(真實姓名和欄目已更改,以保持簡單)

INSERT IGNORE INTO tag (SELECT null, strSplit(`Tag`,'|',1) AS T FROM `old_venue` GROUP BY T) 

沖洗和重複一個每個collumn增加POS(在這種情況下,我有一個最大的8個分隔符的)

三得到的關係

INSERT INTO `venue_tag_rel` 
(Select a.`venue_id`, b.`tag_id` from `old_venue` a, `tag` b 
    WHERE 
    (   
    a.`Tag` LIKE CONCAT('%|',b.`tag_nm`) 
    OR a.`Tag` LIKE CONCAT(b.`tag_nm`,'|%') 
    OR a.`Tag` LIKE CONCAT(CONCAT('%|',b.`tag_nm`),'|%') 
    OR a.`Tag` LIKE b.`tag_nm` 
    ) 
) 
2

這裏是我使用PHP的嘗試...,我想這可以更聰明的MySQL查詢更有效。我也把它的關係部分放在那裏。沒有逃脫和錯誤檢查。

$rs = mysql_query('SELECT `venue_id`, `tag` FROM `venue` AS a'); 
while ($row = mysql_fetch_array($rs)) { 
    $tag_array = explode('|',$row['tag']); 
    $venueid = $row['venue_id']; 
    foreach ($tag_array as $tag) { 
     $rs2 = mysql_query("SELECT `tag_id` FROM `tag` WHERE tag_nm = '$tag'"); 
     $tagid = 0; 
     while ($row2 = mysql_fetch_array($rs2)) $tagid = $row2['tag_id']; 
     if (!$tagid) { 
      mysql_execute("INSERT INTO `tag` (`tag_nm`) VALUES ('$tag')"); 
      $tagid = mysql_insert_id; 
     } 
     mysql_execute("INSERT INTO `venue_tag_rel` (`venue_id`, `tag_id`) VALUES ($venueid, $tagid)"); 
    } 
} 
+0

+1是的,就像這樣。我認爲開發一個PHP腳本(或者其他任何真正的語言)要比在SQL代碼中完成這些工作更容易開發和調試。 – 2010-11-17 06:10:20

+0

但這隻能解決PHP程序員的問題。我添加了一個MYSQL答案供將來參考。 +1回答,但沒有經過測試 – Moak 2010-11-17 06:17:09

相關問題