0

我有一个包含多个字段的 MySQL 表;像这样:

id  name  ton           dyr
1   moo   FRET_GTR_HYU  ra
2   maa   DER_GY_TR_DB  fe
3   tee   SAME_IQ       tete
...

问题是ton列的每一行的内容是独立的,但它们用符号“_”连接。

我想修改表格,拆分字段ton以最终在其他字段中保留所有相同的条目,但在ton字段中每行只有一个条目,就像这样......

id  name  ton      dyr
1   moo   FRET     ra
1   moo   GTR      ra
1   moo   HYU      ra
2   maa   DER      fe
2   maa   GY       fe
2   maa   TR       fe
2   maa   DB       fe
3   tee   SAME     tete
3   tee   IQ       tete

...

我试图修改此页面中给出的代码来执行这项工作,但由于我不是 MySQL 专家,我无法让它以我的方式工作。在上面的链接中,给出的代码适合重写给定的两列,而不是任何其他字段。

有关如何修改代码或以其他方式进行的任何帮助?

4

2 回答 2

1

您应该使用SUBSTRING_INDEX MySQL 字符串函数。以下内容应返回您所要求的内容:

INSERT INTO table2
SELECT id, name, SUBSTRING_INDEX(ton, '_', 1), dyr FROM table1
UNION
SELECT id, name, SUBSTRING_INDEX(ton, '_', -1), dyr FROM table1
于 2012-07-02T15:31:51.453 回答
1

1)将table1结构复制到table2

2) 将 2 个存储过程添加到您的数据库中。

CREATE PROCEDURE peixe()
BEGIN
  DECLARE done BOOLEAN DEFAULT 0;
  DECLARE i INT;
  DECLARE cursor_id CURSOR FOR SELECT id FROM table1 WHERE ton LIKE '%_%';
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
  OPEN cursor_id;
  FETCH cursor_id INTO i;
  REPEAT
    CALL split_ton(i);
    FETCH cursor_id INTO i;
  UNTIL done END REPEAT;
  CLOSE cursor_id;
END

CREATE PROCEDURE split_ton(i INT)
BEGIN
  DECLARE str_name VARCHAR(50);
  DECLARE str_ton VARCHAR(50);
  DECLARE str_ton_el VARCHAR(50);
  DECLARE str_dyr VARCHAR(50);
  DECLARE ton_size INT;

  SELECT name, ton, dyr
  INTO str_name, str_ton, str_dyr
  FROM table1 WHERE id=i;

  SET ton_size = LENGTH(str_ton) - LENGTH(REPLACE(str_ton, '_', '')) + 1;

  WHILE ton_size > 0 DO
    SET str_ton_el = SUBSTRING_INDEX(str_ton, '_', -1);
    SET str_ton = SUBSTRING_INDEX(str_ton, '_', ton_size - 1);
    INSERT INTO table2 (id, name, ton, dyr) VALUES (i, str_name, str_ton_el, str_dyr);
    SET ton_size = ton_size - 1;
  END WHILE;
END

3) 最后,执行以下语句:

CALL peixe

我想,你已经完成了:-)

于 2012-07-03T00:43:50.783 回答