【问题标题】:MySQL INSERT INTO SELECT JOINMySQL INSERT INTO SELECT JOIN
【发布时间】:2012-04-19 11:58:33
【问题描述】:

我正在尝试将旧的 MySQL 基础修改为新的 - 我希望更好。所以我有一个问题,因为我自己无法处理:

我有一张有 5 列的旧表:

*table_old*
id | name_1 | name_2 | name_3 | role 
 1 |    aaa |    bbb |    ccc |    g 
 2 |    aaa |    ccc |    ddd |    f 
 3 |    bbb |    aaa |    ddd |    g 

等等。

我创建了一个新表来存储 2 列的名称值,它看起来像这样:

*table_name*
id | name 
 1 |  aaa
 2 |  bbb
 3 |  ccc
 4 |  ddd

因为我使用它角色命名新表(旧表的最后一列),所以我可以创建具有 4 列的新表:

*table_g*
id | name_1 | name_2 | name_3
 1 |    aaa |    bbb |    ccc
 2 |    bbb |    aaa |    ddd

*table_f*
id | name_1 | name_2 | name_3
 1 |    aaa |    ccc |    ddd

另外,因为名称可能很长,我更喜欢使用表 2 中的 id 值而不是名称 - 我想得到类似的东西:

*table_g*
id | id_1 | id_2 | id_3
 1 |    1 |    2 |    3
 2 |    2 |    1 |    4

*table_f*
id | id_1 | id_2 | id_3
1  |    1 |    3 |    4

我将列的名称从 *name_1* 更改为 *id_1* 等。

现在我正在寻求帮助。我正在尝试使用类似的东西:

INSERT INTO `table_g`(`id_1`, `id_2`, `id_3`)
SELECT `table_name`.`id`,`table_name`.`id`,`table_name`.`id`
FROM `table_name` 
  RIGHT JOIN `table_old` ON `table_name`.`name` = `table_old`.`name_1`
  RIGHT JOIN `table_old` ON `table_name`.`name` = `table_old`.`name_2`
  RIGHT JOIN `table_old` ON `table_name`.`name` = `table_old`.`name_3`
WHERE `table_old`.`role` = 'g';

但这不起作用...如果可以,请提供帮助:/

【问题讨论】:

  • “不起作用”到底是什么意思?你有错误吗?有没有可能是关于“模棱两可的名字”?
  • 嗯,我不确定,但我想你忘记了一些括号:INSERT INTO table ()... (SELECT... FROM... JOINS WHERE...)
  • 不,我得到了#1054 - Unknown column 'table_old'.'role' in 'where clause'

标签: mysql


【解决方案1】:
INSERT INTO `table_g`(`id_1`, `id_2`, `id_3`)
SELECT t1.`id`, t2.`id`, t3.`id`
FROM `table_name` tn
  RIGHT JOIN `table_old` t1 ON tn.`name` = t1.`name_1` AND t1.`role` = 'g'
  RIGHT JOIN `table_old` t2 ON tn.`name` = t2.`name_2` AND t2.`role` = 'g'
  RIGHT JOIN `table_old` t3 ON tn.`name` = t3.`name_3` AND t3.`role` = 'g'

乍一看,您的选择有很多歧义,所以至少您应该尝试使用上面的代码会发生什么。

【讨论】:

  • 不起作用:/ #1054 - Unknown column 't1.id' in 'field list'
  • select * from table_old limit 1 的结果是什么?
  • id | name_1 | name_2 | name_3 | role 1 | aaa | bbb | ccc | g 我认为我只是使用 UPDATE :/
猜你喜欢
  • 2017-11-25
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2011-10-25
  • 2011-07-12
  • 2014-07-08
  • 1970-01-01
  • 2012-01-23
相关资源
最近更新 更多