规范化表的简单方法

时间:2017-04-27 11:38:03

标签: mysql sql

我有一个这样的表 - 这是用户表的一部分,当用户注册时,它会获得更多行的更新:

user_id languages 
1       english, french 
2       english,german,french
3       german
4       english, spanish

为了进行小规模搜索,我很想将这个表转换成:

user_id language
1          english
1          french
2          english
2          german
2          french
3          german
4          english
4          spanish

注释:没有创建新表,只是正确地从users表中选择正确的select查询来执行此操作。 我正在使用phpmyadmin的mysql。欢迎任何帮助。感谢的。

1 个答案:

答案 0 :(得分:0)

正如其他人所说,将逗号分隔值存储在列中会导致各种各样的痛苦。说完了......

创建一个数字表(描述here的一种方法)。完成后,您可以使用它将逗号分隔值拆分为单独的行:

select lang.user_id,
       SUBSTRING_INDEX(SUBSTRING_INDEX(lang.languages, ', ', numbers.n), ', ', -1) language
from numbers 
inner join lang on CHAR_LENGTH(lang.languages) - CHAR_LENGTH(REPLACE(lang.languages, ', ', ' ')) >= numbers.n - 1
order by lang.user_id, numbers.n;

DEMO