Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果相等,则插入mysql_Mysql_Sql - Fatal编程技术网

如果相等,则插入mysql

如果相等,则插入mysql,mysql,sql,Mysql,Sql,我的桌子像: 水平仪 id:主键 订单:整数 计划 id:主键 级别:外键级别 极限:整数 请求: id:主键 计划id:外键计划 当有一个请求时,将数据保存到请求表中,然后计算所有请求并与表计划中的限制进行比较。如果相等,则我将数据插入到表格级别中的表格计划中,其级别\u id=订单的级别\u id+1,否则不执行任何操作。我用多个单查询实现它,但现在我想在单查询中优化它。这可能吗?提前感谢 第一: INSERT INTO request(plan_id) SELECT id FROM PLA

我的桌子像:

水平仪

id:主键

订单:整数

计划

id:主键

级别:外键级别

极限:整数

请求: id:主键

计划id:外键计划

当有一个请求时,将数据保存到请求表中,然后计算所有请求并与表计划中的限制进行比较。如果相等,则我将数据插入到表格级别中的表格计划中,其级别\u id=订单的级别\u id+1,否则不执行任何操作。我用多个单查询实现它,但现在我想在单查询中优化它。这可能吗?提前感谢

第一:

INSERT INTO request(plan_id) SELECT id FROM PLAN WHERE ...
下一步:

如果A=B,我将使用php进行比较

INSERT INTO plan (level_id, order) SELECT id, order FROM level WHERE ..
否则
注意要做的事

我并不真正理解你所做的事情的逻辑,但是为了回答你的问题,你可以将你当前作为A和B的查询移动到insert中的子查询中。比如:

INSERT INTO plan (level_id, order) 
SELECT id, order 
FROM level 
WHERE {existing where logic here}
AND (
       SELECT COUNT(request.id) FROM request
       WHERE request.plan_id = ...
    ) = (
       SELECT limit FROM plan
       WHERE  ...
    )

如果子查询彼此不相等,那么insert将什么也做不了。

我不太理解您所做的逻辑,但是为了回答您的问题,您可以将当前作为A和B查询的内容移动到insert中的子查询中。比如:

INSERT INTO plan (level_id, order) 
SELECT id, order 
FROM level 
WHERE {existing where logic here}
AND (
       SELECT COUNT(request.id) FROM request
       WHERE request.plan_id = ...
    ) = (
       SELECT limit FROM plan
       WHERE  ...
    )

如果子查询彼此不相等,那么插入就没有任何作用。

我认为最好通过编写一个触发器来处理更新,该触发器监视表上的插入请求,如下所示:

为每行请求插入后创建触发器级别\u触发器 new here表示请求中新插入的行 @A:=从请求中选择COUNTrequest.id,其中request.plan\u id=new.plan\u id @B:=从计划中选择限额,其中plan.id=new.plan\u id 如果@A=@B那么 无论您的insert查询是什么。对此我不是很清楚。 插入到计划级别\u id,订单选择id,订单从何处开始。。
如果结束 我认为最好通过编写一个触发器来处理更新,该触发器监视表请求上的插入,如下所示:

为每行请求插入后创建触发器级别\u触发器 new here表示请求中新插入的行 @A:=从请求中选择COUNTrequest.id,其中request.plan\u id=new.plan\u id @B:=从计划中选择限额,其中plan.id=new.plan\u id 如果@A=@B那么 无论您的insert查询是什么。对此我不是很清楚。 插入到计划级别\u id,订单选择id,订单从何处开始。。
如果结束;我不太明白这些要求。为什么不包括你现有的查询,这样我们就可以看到逻辑?@Ben我现在在街上,所以我不能包括我的查询,但我写了一个关于我的逻辑的查询示例。你们能帮我吗?请提供表格中的数据和期望的输出,以便更好地理解。我想你可以用CTE来实现这一点。我不太理解这些要求。为什么不包括你现有的查询,这样我们就可以看到逻辑?@Ben我现在在街上,所以我不能包括我的查询,但我写了一个关于我的逻辑的查询示例。你们能帮我吗?请提供表格中的数据和期望的输出,以便更好地理解。我认为你可以通过CTE来实现这一点。