gpt4 book ai didi

mysql - 如何将带有子查询同表的MySQL select语句转换为update语句?

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:16 25 4
gpt4 key购买 nike

我有以下工作选择语句。

SELECT t1.id, t1.option_key, ( 
SELECT
t3.content AS option_value
FROM tblfoo t2
LEFT OUTER JOIN tblbar t3 ON( t3.refid = t2.id )
WHERE t2.id = t1.id
LIMIT 1
) AS option_value
FROM tblfoo t1

表结构如下:

| tblfoo                         |
+----+------------+--------------+
| id | option_key | option_value |
+----+------------+--------------+
| 1 | foo | NULL |
| 2 | bar | NULL |
| 3 | baz | NULL |


| tblbar |
+----+-----------------+
| id | refid | content |
+----+-----------------+
| 1 | 1 | value1 |
| 1 | 2 | value2 |
| 1 | 3 | value3 |

更新语句的结果应该是这样的:

| tblfoo                         |
+----+------------+--------------+
| id | option_key | option_value |
+----+------------+--------------+
| 1 | foo | value1 |
| 2 | bar | value2 |
| 3 | baz | value3 |

我想用 tblfoo 和来自 tblbarcontent 的相关数据更新 option_value。不幸的是,tblbar 可能有多个具有相同值的 refid 条目。这就是为什么子查询需要 LIMIT 1(或 GROUP BY t,idDISTINCT)。

我发现,当我使用 LIMIT 1 进行子查询而不是使用 SELECT DISTINCT 进行子查询或结合 进行连接时,查询明显更快>GROUP BY t1.id。所以在执行时间优化之后,我最终得到了上面的 select 语句。

源表也有问题,应该更新。 option_value 是一个实际字段,它也存在于源表中(但具有 NULL 值)。

我在尝试将上面优化的 select 语句转换为更新语句时遇到的问题主要是我无法从子查询内部访问 t1.id

如何在不失性能优化的情况下将select语句转换为update语句?

最佳答案

只需将更新连接与在 tblbar 中查找不同值的子查询一起使用:

UPDATE tblfoo f
INNER JOIN
(
SELECT DISTINCT refid, content
FROM tblbar
) b
ON f.id = b.refid
SET f.option_value = b.content;

关于mysql - 如何将带有子查询同表的MySQL select语句转换为update语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53222401/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com