Я ищу наиболее эффективный способ выбора данных заказа woocommerce (wp_posts) и нескольких значений из одного столбца (wp_postmeta) в одном запросе.То, что я уже построил, работает, но я не уверен, что это будет лучшим способом сделать это.
Может быть, у кого-то есть более эффективный способ сделать это, потому что с большим количеством заказов это действительно получаетсямедленно: первый пример 20 секунд +, второй 60 секунд +).
Я упростил этот пример, поскольку сейчас я получаю 8 различных пар meta_key и meta_value для каждого заказа.
Любая помощь приветствуется!
Структура базы данных wp_postmeta выглядит следующим образом:
meta_id | post_id | meta_key | meta_value
И примеры данных следующие:
1 | 2 | _order_currency | EUR
2 | 2 | _billing_email | mail@mail.com
3 | 2 | _payment_method | paypal
Мое лучшее решение на данный момент:
SELECT
p.ID,
p.post_date,
p.post_status,
p.post_type,
max( CASE WHEN pm.meta_key = '_order_currency' and p.ID = pm.post_id THEN pm.meta_value END ) as order_currency,
max( CASE WHEN pm.meta_key = '_billing_email' and p.ID = pm.post_id THEN pm.meta_value END ) as billing_email,
max( CASE WHEN pm.meta_key = '_payment_method' and p.ID = pm.post_id THEN pm.meta_value END ) as payment_method,
FROM
wp_posts p
JOIN
wp_postmeta pm
ON p.ID = pm.post_id
WHERE
p.post_type = 'shop_order'
AND
p.post_status = 'wc-completed'
GROUP BY
p.ID
Другой пример, который я построил, который также работаетно намного медленнее это:
SELECT
p.ID,
p.post_date,
p.post_status,
p.post_type,
pm1.meta_value as order_currency,
pm2.meta_value as billing_email,
pm3.meta_value as payment_method
FROM
wp_posts p
JOIN wp_postmeta pm ON p.ID = pm.post_id
LEFT JOIN wp_postmeta AS pm1 AND pm1.post_id = p.ID AND pm1.meta_key = '_order_currency'
LEFT JOIN wp_postmeta AS pm2 AND pm2.post_id = p.ID AND pm2.meta_key = '_billing_email'
LEFT JOIN wp_postmeta AS pm3 AND pm3.post_id = p.ID AND pm3.meta_key = '_payment_method'
WHERE
p.post_type = 'shop_order'
AND
p.ID = pm.post_id
AND
p.post_status = 'wc-completed'
GROUP BY
p.ID