2012-10-19 20 views
0

我继承,其中一人表有一个称为authorised_areas领域的数据库。前端允许用户从选取列表中选择多个条目(使用区域表的描述字段中的值填充),然后将authorised_areas的值设置为以逗号分隔的列表。我正在将它迁移到MySQL数据库,而我在这里时,我想通过从person表中删除authorised_areas字段并创建一个多对多表person_area来提高数据库的完整性, - 区键。有几百个人的记录,所以我想找到一种方法来有效地使用几个MySQL语句,而不是单独的插入或更新语句来做到这一点。如何列表字段转换成许多一对多表在MySQL

只是为了澄清,目前的结构是一样的东西:

person 
id name authorised_areas 
1  Joe  room12, room153, 2nd floor office 
2  Anna room12, room17 

area 
id description 
1  room12 
2  room17 
3  room153 
4  2nd floor office 

...但我想的是:

person 
id name 
1  Joe 
2  Anna 

area 
id description 
1  room12 
2  room17 
3  room153 
4  2nd floor office 

person_area 
person_id  area_id 
1    1 
1    3 
1    4 
2    1 
2    2 

有一个在人的区域ID没有引用表(和列表中的一些文本值与区域表中的描述不完全相同),所以这需要通过文本或模式匹配来完成。如果我写一些php代码来分割字符串,找到匹配并在多对多表中插入适当的值,我会更好吗?

我会感到惊讶,如果我是第一人,要做到这一点,但谷歌搜索没有露面任何有用的东西(也许我没有使用适当的搜索词?)如果有人可以提供一些建议有效地做到这一点,我非常感谢。

回答

0

虽然可以做到这一点,我建议作为一次性的工作,很可能会更快地磕了一个PHP(或您最喜欢的脚本语言)脚本多个插入做到这一点。

如果您必须在单个语句中执行此操作,则需要一个整数表(0到9,针对自身进行交叉连接以获得所需的大范围),并将其与您的原始表加入,并使用字符串函数获取第X个逗号,并从每行的每个值中获取。

可能的,我已经做到了,但主要是为了表明,有一个分隔字段是不是一个好主意。使用多个插入文件的脚本可能会更快。

你可以立足于这样的选择插入(尽管这也与每个人以及相关的人一个空行来了,只会用每人高达1000授权领域应对)

SELECT z.id, z.name, x.an_authorised_area 
FROM person z 
LEFT OUTER JOIN (
SELECT DISTINCT a.id, SUBSTRING_INDEX(SUBSTRING_INDEX(authorised_areas, ",", b.ournumbers) , ",", -1) AS an_authorised_area 
FROM person a, (
SELECT hundreds.i *100 + tens.i *10 + units.i AS ournumbers 
FROM integers AS hundreds 
CROSS JOIN integers AS tens 
CROSS JOIN integers AS units 
)b 
)x ON z.id = x.id 
相关问题