Как выбрать данные заказа woocommerce (wp_posts) и добавить несколько значений из одного столбца (wp_postmeta) в одном запросе - PullRequest
0 голосов
/ 05 февраля 2019

Я ищу наиболее эффективный способ выбора данных заказа 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
...