2011-10-06 4 views
2

Je travaille avec wordpress et j'ai besoin de créer un déclencheur qui met à jour une table quand une autre est mise à jour. J'ai créé le déclencheur et elle a travaillé en théorie, mais elle ne fait que mettre à jour le premier enregistrement et mettre en pause son exécution. La variable utilisée pour stocker un select qui retourne serait l'un des identifiants séparés par des virgules.MySQL Trigger ne fonctionne pas très bien

Eq: Le select retourne quelque chose comme: 424532123212

et l'utiliser dans une mise à jour en mettant « dans ».

UPDATE wp_posts SET e.post_modified = date (NEW.modified_date) e.ID WHERE IN (@ids); 

Et comme je l'ai dit à jour que le premier enregistrement dans ce cas serait 424

Je souhaite que quelqu'un me aider.

Voici le déclencheur:

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

N'utilisez pas la syntaxe de jointure SQL '89 implicite. C'est un anti-pattern, utilisez plutôt une syntaxe de jointure explicite. – Johan

+0

avez-vous vérifier quelles valeurs retournent par ** @ ids ** ..? – Chandresh

Répondre

1

Je pense que vous avez été mordu par l'anti-pattern appelé syntaxe de jointure implicite.
Il provoque toutes sortes de problèmes.
Rendez vos jointures explicites afin de ne pas vous retrouver avec spaggeti de jointure croisée.

SQL et CSV ne se mélangent pas non plus.

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 // 

Vous ne pouvez pas update une table et select de la même table dans une sous-sélection.

Mais vous pouvez mettre à jour une table et sélectionnez la même table dans un sous-sous-sélection.
La raison en est qu'un sous-sous-select est forcé à s'exécuter avant la mise à jour, alors qu'un sous-élément 'simple' peut être exécuté simultanément avec la mise à jour, ce qui causerait toutes sortes de problèmes.

+0

MERCI BEAUCOUP! Cela fonctionne juste! ;ré –

1

Ne pas enregistrer les valeurs id dans une variable. Utilisez la sous-requête directement dans la requête UPDATE. Aussi, comme Johan a dit - n'utilisez pas la syntaxe implicite de jointure.

Questions connexes