我正在使用wordpress,需要创建一个触发器,在更新另一个表时更新表。我创建了触发器,她在理论上工作,但它只更新第一条记录并暂停执行。用于存储返回的选择的变量将是以逗号分隔的ID之一。
Eq:select返回类似于:424,532,123,212
并在更新中使用“in”。
UPDATE wp_posts SET e.post_modified = date (NEW.modified_date) e.ID WHERE IN (@ids);
正如我所说,只更新本案中的第一条记录将是424
我希望有人能帮助我。
这是触发器:
CREATE TRIGGER triggerupdatedata AFTER UPDATE ON wp_ngg_gallery
FOR EACH ROW BEGIN
set @ids := (SELECT
GROUP_CONCAT(a.ID SEPARATOR ',')
FROM
wp_posts a, wp_postmeta b, wp_ngg_gallery c
WHERE
c.gid = OLD.gid
AND
a.ID = b.post_id
AND
b.meta_key = 'galeria_id'
AND
c.gid = (SELECT d.meta_value FROM wp_postmeta d WHERE d.post_id = a.ID AND d.meta_key = 'galeria_id')
);
UPDATE wp_posts e SET e.post_modified = date(NEW.modified_date) WHERE e.ID IN (@ids);
END;//
答案 0 :(得分:1)
不要将id值保存到变量中。直接在UPDATE查询中使用子查询。 此外,就像约翰所说 - 不要使用隐式连接语法。
答案 1 :(得分:1)
我认为你被称为隐式连接语法的反模式所困扰 它会引起各种各样的问题 使你的联接显式,这样你就不会以交叉联接spaggeti结束。
SQL和CSV也不会混用。
CREATE TRIGGER au_wp_ngg_gallery_each AFTER UPDATE ON wp_ngg_gallery FOR EACH ROW
BEGIN
UPDATE wp_posts e SET e.post_modified = date(NEW.modified_date) WHERE e.ID IN (
SELECT * FROM (
SELECT a.id
FROM wp_posts p
INNER JOIN wp_postmeta pm ON (pm.post_id = p.id AND pm.meta_key = 'galeria_id')
INNER JOIN wp_postmeta pm2 ON (pm2.post_id = p.id AND pm2.meta_key = 'galeria_id')
/* not sure if the join on pm2 is needed or not */
INNER JOIN wp_ngg_gallery ng ON (ng.gid = pm2.meta_value)
WHERE
ng.gid = OLD.gid ) sub) subsubhack);
END //
您不能在子选择中的同一个表中
update
表和select
。
但可以更新表格,并在子子选择中从同一个表格中选择。
原因是在更新之前强制子子选择运行,而“仅仅”子选择可以与更新同时运行,这将导致各种问题。