Использование результата подзапроса дважды в MySQL


Я создаю триггер для обновления одной таблицы при вставке строки в другую таблицу. В этом операторе обновления мне нужно выбрать значение из первой таблицы. Затем мне нужно использовать это выбранное значение в двух местах инструкции update. Вот триггерный оператор, который у меня теперь есть:

CREATE TRIGGER rsrcInsTrig AFTER INSERT ON jos_resources
FOR EACH ROW 
    UPDATE newtbl
    SET subtree_count = subtree_count + 1
    WHERE lft <= (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id)
    AND rgt >= (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id);
Это прекрасно работает, но не очень элегантно (мне не нужно говорить, что "newtbl" - не очень хорошее название для стола; я его не делал). Ясно, что я хотел бы, чтобы подзапрос был запущен только один раз, с значение сохранено и использовано дважды. Если бы это был язык программирования, я бы определил переменную. Есть ли способ сделать то, что я хочу? Действительно ли это проблема (обратите внимание, что "newtbl" имеет более 1,5 миллионов записей, поэтому запросы к нему не являются незначительными)? Другие вопросы по этой теме были решены с помощью соединений, но я не думаю, что это применимо здесь.
2 2

2 ответа:

CREATE TRIGGER rsrcInsTrig AFTER INSERT ON jos_resources
FOR EACH ROW BEGIN
    DECLARE tmplft INT DEFAULT 0; -- assuming it really is an INT
    SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id INTO tmplft;
    UPDATE newtbl
    SET subtree_count = subtree_count + 1
    WHERE lft <= tmplft
    AND rgt >= tmplft;
END

Предложение WHERE можно выразить немного иначе:

UPDATE newtbl
SET subtree_count = subtree_count + 1
WHERE (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id) between lft and rgt