我已阅读MySQL - UPDATE query based on SELECT Query并尝试执行类似的操作 - 即在表格上运行UPDATE
查询,并使用SELECT
的结果填充它。
在我的情况下,我要更新的表名为substances
,并且有一个名为cas_html
的列,它应该将CAS编号(化学代码)存储为HTML字符串。
由于数据库的结构,我运行以下查询,它将为我提供物质ID和名称(substances.id
,substances.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)
答案 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