2011-10-06 66 views
2

我正在使用wordpress,并且需要创建一个触发器,在另一个更新时更新表。我创建了触发器,她在理论上工作,但它只更新第一条记录并暂停执行。用于存储返回的select的变量将是以逗号分隔的id之一。MySQL触发器不能很好地工作

式:该选择回报是这样的:424532123212

而且通过把“中”的更新中使用它。

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

不要使用隐式SQL '89连接语法它是反模式,而是使用显式连接语法。 – Johan

+0

您是否检查了** @ids **返回的值? – Chandresh

回答

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

但是你可以更新表和子子选择从同一个表中选择。
原因是在更新之前,子子选择被强制运行,而“仅仅”子选择可以与更新同时运行,这会导致各种问题。

+0

非常感谢!它只是工作! ; d –

1

ID值不保存到一个变量。在UPDATE查询中直接使用子查询。另外,像约翰说的 - 不使用隐式连接语法。