我有这样的表:
当有请求时,将数据保存到请求表,之后,我计算所有请求并与表计划中的限制进行比较。如果相等,我将数据插入到表计划中,表级别的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 ..
否则无事可做
我并不真正理解你正在做的事情的逻辑,但是为了回答你的问题,你可以将你目前拥有的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 ...
)
如果子查询彼此不相等,那么插入就不会做任何事情。
我认为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;