WooCommerce - Запрос заказанных товаров

15 янв. 2016 г., 23:19:35
Просмотры: 20.6K
Голосов: 2

Я пытаюсь получить все заказы за определенный день/время, а затем заказанные товары, используя SQL (MySQL), как показано в запросе ниже:

select 
    p.ID as order_id,
    p.post_date,
    i.order_item_name,
    max( CASE WHEN im.meta_key = '_product_id' and p.ID = im.order_item_id THEN im.meta_value END ) as Prod_ID
from 
    wp_posts as p,
    wp_postmeta as pm,
    wp_woocommerce_order_items as i,
    wp_woocommerce_order_itemmeta as im
where 
    p.post_type = 'shop_order'
    and p.ID = pm.post_id
    and p.ID = i.order_id
    and p.post_date BETWEEN '2016-01-14 00:00:00' AND '2016-01-14 23:59:59'
    and p.post_status = 'wc-processing'

Похоже, что когда я пытаюсь сделать запрос к таблице wp_woocommerce_order_itemmeta для получения данных о заказанных товарах, я теряю соединение с базой данных (время соединения истекает во время выполнения запроса).

Есть какие-нибудь идеи, что происходит?

3
Комментарии

Это немного не по теме, поскольку касается MySQL и WooCommerce, но не конкретно WordPress. Возможно, вы достигли лимита, и таблицы слишком большие или что-то в этом роде — я точно не эксперт по MySQL, но попробуйте ограничить результаты с помощью LIMIT до 1 или 2 и посмотрите, вернется ли что-то. Еще одна идея — использовать COUNT() для подсчета количества строк, которые должны быть возвращены.

Howdy_McGee Howdy_McGee
15 янв. 2016 г. 23:23:29

На этот день всего 46 заказов, так что проблем быть не должно. В любом случае, я попробую обратиться к разработчикам WooCommerce на форуме WP.

JackTheKnife JackTheKnife
15 янв. 2016 г. 23:25:54

Хотя в админке вы видите только 46 заказов — возможно, запрос составлен некорректно и возвращает больше результатов, чем ожидается, что может быть корнем проблемы. Просто предложения, чтобы исключить мелочи. Удачи!

Howdy_McGee Howdy_McGee
15 янв. 2016 г. 23:41:56
Все ответы на вопрос 2
2

Исправленный запрос

select 
        p.ID as order_id,
        p.post_date,
        i.order_item_name,
        max( CASE WHEN im.meta_key = '_product_id' and i.order_item_id = im.order_item_id THEN im.meta_value END ) as Prod_ID
    from 
        wp_posts as p,
        wp_postmeta as pm,
        wp_woocommerce_order_items as i,
        wp_woocommerce_order_itemmeta as im
    where 
        p.post_type = 'shop_order'
        and p.ID = pm.post_id
        and p.ID = i.order_id
        and p.post_date BETWEEN '2016-01-14 00:00:00' AND '2016-01-14 23:59:59'
        and p.post_status = 'wc-processing'

Пояснение: ID записи не имеет прямой связи с метаданными элемента заказа

19 янв. 2016 г. 19:16:15
Комментарии

очень неэффективный SQL-запрос, вам следует использовать соединение с таблицей itemmeta вместо cross join. этот ответ следует удалить

xnagyg xnagyg
8 февр. 2019 г. 23:03:48

In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'p.ID'; this is incompatible with sql_mode=only_full_group_by

Olaf Erlandsen Olaf Erlandsen
11 мая 2019 г. 08:04:03
0

Решил обновить этот материал, так как нашел его при создании собственной системы отчетов.

Более правильный метод — использовать соответствующие INNER JOIN для сокращения времени выполнения запросов:

SELECT 
    p.ID AS order_id,
    p.post_date,
    i.order_item_name,
    MAX( CASE WHEN im.meta_key = '_product_id' AND i.order_item_id = im.order_item_id THEN im.meta_value END ) AS Prod_ID
FROM 
    wp_posts AS p
    INNER JOIN
    wp_postmeta AS pm 
    ON p.id = pm.post_id
    INNER JOIN
    wp_woocommerce_order_items AS i 
    ON p.id = i.order_id
    INNER JOIN 
    wp_woocommerce_order_itemmeta AS im 
    ON i.order_item_id = im.order_item_id
WHERE 
    p.post_type = 'shop_order'
    AND p.post_date BETWEEN '2017-04-29 00:00:00' AND '2017-04-30 23:59:59'
    AND p.post_status = 'wc-processing';
2 мая 2017 г. 05:03:12