Как разделить столбец с разделителями труб и вставить каждое значение в новую таблицу. - PullRequest
2 голосов
/ 17 ноября 2010

У меня есть старая база данных с gazillion записей (более или менее), которые имеют один столбец тегов (с разделителями тегов), который выглядит так:может извлечь каждый тег и вставить его в новую таблицу tag_id | tag_nm, используя только MySQL?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Вот моя попытка, которая использует 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)");
    }
}
1 голос
/ 17 ноября 2010

После того, как я обнаружил, что нет официальной функции разбиения, я решил проблему, используя только 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)

Промыть и повторить увеличение позиции на единицу для каждого столбца (в этом случае у меня было максимум 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`
     ) 
)
...