我目前有一个名为“RESOURCES”的表,其中包含一个名为“RES_Tags”的关键字字段。 “RES_Tags”字段包含以逗号分隔的每条记录的关键字列表。
我需要规范化这个表/字段。
我已经设置了以下表格:TAGS,TAGS_TO_RESOURCES。
请参阅此处的架构:http://sqlfiddle.com/#!9/edac4/1
什么是允许我解析RES_Tags中的关键字的查询,将它们写入TAGS表而不创建重复项,然后在TAGS_TO_RESOURCES表中写一个列表?
答案 0 :(得分:1)
请将您的代码复制到实际发布中,并提供您尝试用来解决问题的代码。
substring_index函数返回一个字符串的一部分,带有一些分隔符(这里是一个逗号),当一个负索引被传递时,它开始搜索来自另一侧的匹配,所以-1
抓取一个项目否则是多项目清单(索引> = 2)。
根据我们的讨论,我已经调整了我是如何做到的,并展示了使用自动增量的示例。 (这是在小提琴的“构建模式”部分中运行的。)
create table TAGS
(`T_ID` int auto_increment primary key, `T_Name` varchar(18))
;
insert ignore into TAGS (T_Name)
SELECT
SUBSTRING_INDEX(RES_Tags, ',', 1) as X
FROM RESOURCES
;
insert ignore into TAGS (T_Name)
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX(RES_Tags, ',', 2)
,',',-1)
FROM RESOURCES
;
insert ignore into TAGS (T_Name)
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX(RES_Tags, ',', 3)
,',',-1) as X
FROM RESOURCES
;
insert ignore into TAGS (T_Name)
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX(RES_Tags, ',', 4)
,',',-1) as X
FROM RESOURCES
;
insert ignore into TAGS (T_Name)
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX(RES_Tags, ',', 5)
,',',-1) as X
FROM RESOURCES
;
insert ignore into TAGS (T_Name)
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX(RES_Tags, ',', 6)
,',',-1) as X
FROM RESOURCES
;
create table New_TAGS like TAGS;
insert into New_TAGS (T_Name)
select distinct trim(T_Name)
from TAGS;
drop table TAGS;
rename table NEW_TAGS to TAGS;
documentation of the substring function Possible duplication of this question
答案 1 :(得分:1)
RESOURCES.RES_tags
创建INSERT ... INTO TAGS ...
语句集。使用UNIQUE
和TAGS
中的ON DUPLICATE KEY ...
约束或使用INSERT ... SELECT ... NOT EXISTS()
阻止重复: a)动态地将一些字符附加到RES_tags
的开头并且将不同的字符附加到结尾(比如说 - 开始,+到结束) - 但是不要将它保存回DB({{1将转换为a,b,c
)
b)将每个“,”转换为结束前一个-a,b,c+
语句并从下一个开始;将' - '替换为仅启动,'+;仅限结尾部分(例如INSERT
替换为-
,insert into tags(tag) values("
变为+
而'")
将,
- 但为了保持其独特性它将被要求添加步骤#1)中提到的东西
执行#1生成的SQL(例如"), ("
)
使用以下标签链接实体:
insert into tags(tag) values("a"), ("b"), ("c")