TransWikia.com

Criar uma Trigger com JOIN para duplicar os dados

Stack Overflow em Português Asked by Richard Lucas on March 5, 2021

CREATE TRIGGER `copiadados`AFTER INSERT 
ON `wp_postmeta`
AS
DECLARE @nome NVARCHAR(50),
@email NVARCHAR(50),
@adicional NVARCHAR(255)
SET @nome = (SELECT meta_value FROM wp_postmeta WHERE meta_key = '_appointment_guest_name')
SET @email = (SELECT meta_value FROM wp_postmeta WHERE meta_key = '_appointment_guest_email')
SET @adicional = (SELECT meta_value FROM wp_postmeta WHERE meta_key = '_cf_meta_value')
INSERT INTO `agendamentos`(post_id, nome, email, dados, data_post) VALUES NEW.@nome, NEW.@email, NEW.@adicional, wp_posts.post_title
INNER JOIN wp_posts on wp_postmeta.post_id = wp_posts.ID

Esse é o código usado até agora, porém não funcionou.
Estou precisando duplicar os dados para uma nova tabela, pois através dela vou usar os dados para gerar PDF.
Estou usando WordPress c/ MySQL.

SELECT wp_posts.post_title, wp_postmeta.meta_value
FROM wp_postmeta
INNER JOIN wp_posts ON wp_postmeta.post_id = wp_posts.ID
WHERE wp_posts.post_type = 'booked_appointments'

inserir a descrição da imagem aqui

One Answer

Vamos por partes. Basicamente sua query seria assim:

SELECT wp_postmeta.post_id,
       wp_posts.post_title
  FROM wp_postmeta
 INNER JOIN wp_posts on wp_posts.id = wp_postmeta.post_id

O problema é que, a mesma tabela "wp_postmeta" contém os dados de um mesmo post em diferentes registros, isso requer que se faça um join com a própria tabela multiplas vezes, para objter name, email e value, algo assim:

 INNER JOIN wp_postmeta wp_name on wp_postmeta.post_id = wp_name.post_id
 INNER JOIN wp_postmeta wp_email on wp_postmeta.post_id = wp_email.post_id
 INNER JOIN wp_postmeta wp_adicional on wp_postmeta.post_id = wp_adicional.post_id

Note que como são multiplos joins com propósitos diferentes, cada um tem um alias diferente. Além disso, é preciso filtrar pelo "meta_key" para obter os valores corretos, então podemos adicionar a cláusula WHERE, assim:

 WHERE wp_name.meta_key = '_appointment_guest_name'
   AND wp_email.meta_key = '_appointment_guest_email'
   AND wp_adicional.meta_key = '_cf_meta_value'

Aqui usei os diferente alias para filtrar o que cada uma deve retornar.
Por fim, para para evitar resultados duplicados, vamos agrupar pelo "post_id". A query completa fica assim:

SELECT wp_postmeta.post_id,
       wp_name.meta_value as nome,
       wp_email.meta_value as email,
       wp_adicional.meta_value as adicional,
       wp_posts.post_title
  FROM wp_postmeta
 INNER JOIN wp_postmeta wp_name on wp_postmeta.post_id = wp_name.post_id
 INNER JOIN wp_postmeta wp_email on wp_postmeta.post_id = wp_email.post_id
 INNER JOIN wp_postmeta wp_adicional on wp_postmeta.post_id = wp_adicional.post_id
 INNER JOIN wp_posts on wp_posts.id = wp_postmeta.post_id
 WHERE wp_name.meta_key = '_appointment_guest_name'
   AND wp_email.meta_key = '_appointment_guest_email'
   AND wp_adicional.meta_key = '_cf_meta_value'
 GROUP BY wp_postmeta.post_id

Pode ser vista funcionando aqui: http://sqlfiddle.com/#!9/860125/1

Por fim, colocar isso numa view:

CREATE VIEW MinhaView AS
    SELECT wp_postmeta.post_id,
           wp_name.meta_value as nome,
           wp_email.meta_value as email,
           wp_adicional.meta_value as adicional,
           wp_posts.post_title
      FROM wp_postmeta
     INNER JOIN wp_postmeta wp_name on wp_postmeta.post_id = wp_name.post_id
     INNER JOIN wp_postmeta wp_email on wp_postmeta.post_id = wp_email.post_id
     INNER JOIN wp_postmeta wp_adicional on wp_postmeta.post_id = wp_adicional.post_id
     INNER JOIN wp_posts on wp_posts.id = wp_postmeta.post_id
     WHERE wp_name.meta_key = '_appointment_guest_name'
       AND wp_email.meta_key = '_appointment_guest_email'
       AND wp_adicional.meta_key = '_cf_meta_value'
     GROUP BY wp_postmeta.post_id;

E ai fazer um SELECT * FROM MinhaView

Pode ver funcionando com a view aqui: http://sqlfiddle.com/#!9/7a1cfe/2

Correct answer by Ricardo Pontual on March 5, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP