Mysql 如何规范具有逗号分隔值的列

Mysql 如何规范具有逗号分隔值的列,mysql,sql,Mysql,Sql,我现在的桌子。仅显示其他字段的id和类型被删除 +---------+----------------------+ | id | genre | +---------+----------------------+ | 1849012 | Animation, Short | | 2016229 | Comedy, Crime, Drama | | 224412 | Drama, Family

我现在的桌子。仅显示其他字段的id和类型被删除

    +---------+----------------------+
    | id      | genre                |
    +---------+----------------------+
    | 1849012 | Animation, Short     |
    | 2016229 | Comedy, Crime, Drama |
    |  224412 | Drama, Family        |
    +---------+----------------------+
我已经创建了Nessery表,如何填充它们?

创建了名为genre的表,其中包含“genreid”和“name”字段

+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| genreid | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(50) | YES  |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+.
我还创建了另一个名为movie2genre的表

+---------+---------+------+-----+---------+-------+
| Field   | Type    | Null | Key | Default | Extra |
+---------+---------+------+-----+---------+-------+
| movieid | int(11) | YES  |     | NULL    |       |
| genreid | int(11) | YES  |     | NULL    |       |
+---------+---------+------+-----+---------+-------+

可以将字符串拆分。生成覆盖最大字符串数的一系列数字。根据当前表交叉连接此项,并使用子字符串索引(子字符串索引(类型“,”,一些生成的子字符串编号),“,”,-1)。这将为您提供每个id的所有类型(尽管最后一个将被复制-使用DISTINCT将其删除)。这可用于填充流派表

在SQL中,这将是:-

INSERT INTO genre (genreid, name) 
SELECT DISTINCT NULL, TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(genre, ',', sub0.aCnt), ',', -1)) 
FROM current_table 
CROSS JOIN 
( 
    SELECT units.a + tens.a * 10 AS aCnt 
    FROM 
    (
        SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
    ) units
    CROSS JOIN
    (
        SELECT 0 AS a UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
    ) tens 
) sub0
然后,您可以根据现有表(使用FIND_IN_SET)加入流派表,以填充movie2genre表

填充后,您可以使用一个简单的查询填充将电影链接到流派的表:-

INSERT INTO movie2genre 
SELECT current_table.id, genre.id 
FROM current_table 
INNER JOIN genre 
ON FIND_IN_SET(genre.name, REPLACE(current_table.genre, ', ', ','))

最好的办法可能是在进行翻译之前填充流派表。创建一个存储过程来“分解”
流派
,然后在
流派
表中搜索id,如果id不存在,则插入一条记录,然后插入到
movie2genre
是否可以使用某种外部语言?例如,将数据拉入PHP,解析流派,然后填充新表?@hogan,这是可能的。但是我如何填充原始表格中的movie2genre和update流派列链接问题是不同的。链接问题要求映射1行->1行,1列->3列;此问题要求映射1行->Nrows