mysql - MySql:用列表设置变量
问题描述
我现在一直在研究 MySQL 语句和类似问题,但我似乎没有任何运气。
我可以创建一个变量来存储要在多个查询中使用的 1 列数据结果吗?这样做会有效还是我对 DB 与 PL 的区别感到困惑?
我在想类似下面的伪代码
SET list = Select ID from Sales;
Update items set aValue = X where salesID in list
delete SalesMessages where salesId in list
我在存储过程中有大约 8 次更新要做,我可以为每种情况进行选择,而不是创建一个变量,但我觉得这不是最好的方法。有什么帮助吗?
解决方案
MySQL 中的变量需要一个简单的值,通常是字符串、数字或布尔值。在这种情况下,您可以做的是通过 路由您的销售 ID GROUP_CONCAT()
,这将返回所有销售 ID 的逗号分隔列表(有一些限制 - 如果您有很多销售 ID 和根本无法过滤它们),然后执行 a FIND_IN_SET()
,它检查逗号分隔列表中的值。像这样的东西适用于小型套装:
SET @list = (SELECT GROUP_CONCAT(ID) FROM Sales);
UPDATE items SET aValue = X WHERE FIND_IN_SET(salesID, @list) > 0;
DELETE FROM SalesMessages WHERE FIND_IN_SET(salesId, @list) > 0;
您还可以完全通过连接绕过变量创建,这会更快,并且可以绕过长度限制GROUP_CONCAT()
:
UPDATE items as i INNER JOIN Sales as s ON s.ID = i.salesID SET i.aValue = X;
DELETE sm FROM SalesMessages as sm INNER JOIN Sales as s ON s.ID = sm.salesID;
推荐阅读
- java - CloudWatch 代理无法跟上日志记录
- firebase - 我的 Firebase 用户身份验证中的未知用户(Flutter/firebase)
- java - 将 EditText 前后的加号和减号按钮分别翻译 Kotlin 中的代码到 Java
- amazon-web-services - AWS lambda 持续时间峰值(与冷启动无关)
- c# - 当我们的类具有类似的高级功能但在方法中返回不同类型时,使用哪种设计模式?
- c - 为什么我的代码没有将结果写入文件?
- elasticsearch - 使用 quarkus logging-gelf 扩展和 ELK 堆栈时出现索引错误
- c# - 使用 Fody Costura 创建包含 CefSharp 的类库
- angular - 在 Angular 中使用 ngbModule 时出错
- ios - 转换到横向后如何更新 UITableViewCell 内的 UICollectionView