MySQL - 当SELECT返回多个列时,根据SELECT的结果更新一列

时间:2018-02-20 10:30:10

标签: mysql

我已阅读MySQL - UPDATE query based on SELECT Query并尝试执行类似的操作 - 即在表格上运行UPDATE查询,并使用SELECT的结果填充它。

在我的情况下,我要更新的表名为substances,并且有一个名为cas_html的列,它应该将CAS编号(化学代码)存储为HTML字符串。

由于数据库的结构,我运行以下查询,它将为我提供物质ID和名称(substances.idsubstances.name)和CAS作为HTML字符串的结果集(来自cas_values)的cas.value

SELECT s.`id`, GROUP_CONCAT(c.`value` ORDER BY c.`id` SEPARATOR '<br>') cas_values, GROUP_CONCAT(s.`name` ORDER BY s.`id`) substance_name FROM substances s LEFT JOIN cas_substances cs ON s.id = cs.substance_id LEFT JOIN cas c ON cs.cas_id = c.id GROUP BY s.id;

示例输出:

id   |   cas_values   |   substance_name
----------------------------------------
1    |   133-24<br>   |   Chemical A
         455-213<br>
         21-234
-----|----------------|-----------------
2        999-23       |   Chemical B
-----|----------------|-----------------
3    |                |   Chemical C
-----|----------------|-----------------

如您所见,cas_values列包含HTML字符串(在“化学C”的情况下也可能是空字符串)。我想将cas_values列中的数据写入substances.cas_html。但是,我无法拼凑如何执行此操作,因为我正在阅读的其他帖子在一列中获取UPDATE的数据 - 我的SELECT查询返回了其他列。

基本上问题是在上面的“示例输出”表中我返回了3列。其他SO帖子似乎只返回了1列,这是UPDATE查询中使用的实际值(在本例中是substances表)。

这可能吗?

我正在使用MySQL 5.5.56-MariaDB

这些是表格的结构,如果这有帮助:

    mysql> DESCRIBE substances;
    +-------------+-----------------------+------+-----+---------+----------------+
    | Field       | Type                  | Null | Key | Default | Extra          |
    +-------------+-----------------------+------+-----+---------+----------------+
    | id          | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | app_id      | varchar(8)            | NO   | UNI | NULL    |                |
    | name        | varchar(1500)         | NO   |     | NULL    |                |
    | date        | date                  | NO   |     | NULL    |                |
    | cas_html    | text                  | YES  |     | NULL    |                |
    +-------------+-----------------------+------+-----+---------+----------------+
    4 rows in set (0.01 sec)

    mysql> DESCRIBE cas;
    +-------+-----------------------+------+-----+---------+----------------+
    | Field | Type                  | Null | Key | Default | Extra          |
    +-------+-----------------------+------+-----+---------+----------------+
    | id    | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
    | value | varchar(13)           | NO   | UNI | NULL    |                |
    +-------+-----------------------+------+-----+---------+----------------+
    2 rows in set (0.01 sec)

    mysql> DESCRIBE cas_substances;
    +--------------+-----------------------+------+-----+---------+----------------+
    | Field        | Type                  | Null | Key | Default | Extra          |
    +--------------+-----------------------+------+-----+---------+----------------+
    | id           | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
    | cas_id       | mediumint(8) unsigned | NO   | MUL | NULL    |                |
    | substance_id | mediumint(8) unsigned | NO   | MUL | NULL    |                |
    +--------------+-----------------------+------+-----+---------+----------------+
    3 rows in set (0.02 sec)

1 个答案:

答案 0 :(得分:2)

尝试这样的事情:

UPDATE substances AS s,
(
SELECT s.`id`, 
GROUP_CONCAT(c.`value` ORDER BY c.`id` SEPARATOR '<br>') cas_values,
GROUP_CONCAT(s.`name` ORDER BY s.`id`) substance_name
FROM substances s
LEFT JOIN cas_substances cs ON s.id = cs.substance_id
LEFT JOIN cas c ON cs.cas_id = c.id    
GROUP BY s.id
) AS t
SET s.cas_html=t.cas_values
WHERE s.id = t.id

如果您不想修改所有值,限制更新以测试它的最佳方法是在where中添加条件,如下所示:

... 
WHERE s.id = t.id AND s.id = 1