mysql - 表在程序中指定了两次,如何解决?
问题描述
尝试运行程序时收到此消息:
程序是:
BEGIN
DECLARE v_user_id INT DEFAULT 0;
DECLARE v_order_id INT DEFAULT 0;
DECLARE v_min_price INT DEFAULT 0;
UPDATE `ordersperformers` SET `ordersperformers`.`Status` = 1
WHERE EXISTS (
SELECT
@v_min_price = MIN(`ordersperformers`.`DeliveryPrice` + `ordersperformers`.`Price`), @v_user_id = `ordersperformers`.`Users_Id` = @v_user_id,
@v_order_id =`ordersperformers`.`Orders_Id`
FROM `ordersperformers`
INNER JOIN
`orders` ON `orders`.`Id` = `ordersperformers`.`Orders_Id` WHERE
NOW() <= DATE_SUB(`orders`.`DeliveryDate`, INTERVAL 2 HOUR) AND `orders`.`Status` = 0 AND `ordersperformers`.`Status` = 0
) AND `ordersperformers`.`Orders_Id` = @v_order_id AND `ordersperformers`.`Users_Id` = @v_user_id;
END
如何解决?
解决方案
我认为你想要一个相关的子查询:
UPDATE ordersperformers op
SET op.Status = 1
WHERE op.Status = 0 AND
op.Orders_Id = @v_order_id AND
op.Users_Id = @v_user_id AND
EXISTS (SELECT 1
FROM orders o
WHERE o.id = op.Orders_Id AND
NOW() <= DATE_SUB(o.DeliveryDate, INTERVAL 2 HOUR) AND
o.Status = 0
);
我改变/修复了一堆其他的东西:
- 表别名使查询更易于编写和阅读。
- 反引号使查询更难写和读。
- 只有在被更新的表上的条件应该在外部
WHERE
,而不是内部WHERE
。 - 在子查询中设置变量
EXISTS
根本没有意义。EXISTS
测试行是否存在。从逻辑上讲,它可以在不评估SELECT
.
推荐阅读
- python - 计算具有相同“键名”的两个不同字典的两个值的平均值?
- php - 我想使用 php 变量作为值将隐藏输入上的数据发送到我的验证 php 页面
- python - 无法将 tkinter 回调值传递给函数
- swiftmailer - Symfony4 swiftMailer 不起作用
- entity-framework-core-2.1 - Does Audit.NET EF work with EF Core 2.1, and specifically ambient transactions
- docker - 无法访问 docker 容器提供的页面
- c - 检查变量是否在C中具有枚举值的更好方法
- java - 在 Android 中读取/写入结果代码
- docker - 从头开始创建新图像,没有任何入口点
- python - 通过聚合数据集的特定列来生成新的数据列