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'
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP