在MySQL中使用子查询的结果两次

时间:2012-09-12 00:02:50

标签: mysql triggers subquery sql-update

我创建了一个触发器,可以在另一个表中插入一行时更新一个表。在此更新语句中,我需要从第一个表中选择一个值。然后我需要在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);

这样做很好,但不是很优雅(我不需要被告知新手不是桌子的好名字;我没有&#39 ;做它)。显然,我希望子查询只运行一次,保存值并使用两次。如果这是一种编程语言,我会定义一个变量。

有没有办法做我想要的?它是否真的是一个问题(注意&#39; newtbl&#39;有超过1.5 百万条目,因此对它的查询并不是无关紧要的)?关于这个主题的其他问题是使用连接解决的,但我不相信这适用于此。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以稍微改变一下WHERE子句:

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