插入如果相等的mysql

问题描述 投票:0回答:2

我有这样的表:

  • 水平 id:主键 顺序:整数
  • 计划 id:主键 级别:外键(等级) 限制:整数
  • request:id:主键 plan_id:外键(计划)

当有请求时,将数据保存到请求表,之后,我计算所有请求并与表计划中的限制进行比较。如果相等,我将数据插入到表计划中,表级别的level_id = level_id为order + 1,否则什么都不做。我用多个单一查询实现它,但现在我想在单个查询中优化它。这可能吗?预先感谢

第一:

INSERT INTO request(plan_id) SELECT id FROM PLAN WHERE ...

下一个:

  A =    SELECT COUNT(request.id) FROM request
     WHERE request.plan_id = ...


  B =  SELECT limit FROM plan
     WHERE  ...

如果A = B(我使用php进行比较)

INSERT INTO plan (level_id, order) SELECT id, order FROM level WHERE ..

否则无事可做

mysql sql
2个回答
1
投票

我并不真正理解你正在做的事情的逻辑,但是为了回答你的问题,你可以将你目前拥有的A和B的查询移动到插入内的子查询中。所以类似于:

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  ...
    )

如果子查询彼此不相等,那么插入就不会做任何事情。


1
投票

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

CREATE TRIGGER level_trig AFTER INSERT ON request FOR EACH ROW

#new here represents the newly inserted row in request

@A := (SELECT COUNT(request.id) FROM request WHERE request.plan_id = new.plan_id)
@B :=  (SELECT limit FROM plan WHERE plan.id = new.plan_id)

if @A = @B then

#whatever your insert query was. I'm not very clear about that. 

INSERT INTO plan (level_id, order) SELECT id, order FROM level WHERE ..

end if;
© www.soinside.com 2019 - 2024. All rights reserved.