Вставьте, если равно MySQL - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть таблица типа:

  • уровень

    идентификатор: первичный ключ

    порядок: целое число

  • план

    id: первичный ключ

    уровень: FOREIGN KEY (уровень)

    limit: interger

  • запрос: id: первичный ключ

    plan_id: FOREIGN KEY (план)

Когда есть запрос, сохранить данные в таблицу запросов, после этого я считаю все запросы и сравниваю с лимитомв плане стола.Если равно, я вставляю данные в план таблицы с level_id = level_id порядка +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 ..

еще не отметив

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Я думаю, что ОБНОВЛЕНИЕ лучше обработать, написав триггер, следящий за вставкой в ​​запрос таблицы, например:

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;
1 голос
/ 11 апреля 2019

Я не совсем понимаю логику того, что вы делаете, но чтобы ответить на ваш вопрос, вы можете переместить то, что у вас есть в данный момент как запросы для 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  ...
    )

Если подзапросы не совпадают друг с другом, вставка ничего не сделает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...