WooCommerce - Interogare pentru produsele comandate
Încerc să obțin toate comenzile pentru o anumită zi/perioadă și apoi să extrag produsele comandate folosind SQL (MySQL) după cum se vede în interogarea de mai jos:
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'
Se pare că atunci când încerc să interoghez tabelul wp_woocommerce_order_itemmeta
pentru datele produselor comandate, pierd conexiunea la baza de date (conexiunea expiră în timpul interogării).
Aveți vreo idee ce se întâmplă?

Interogare corectată
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'
Explicație: ID-ul postării nu are o relație directă cu metadatele articolului din comandă

SQL foarte ineficient, ar trebui să faci join pe tabela itemmeta în loc de cross join. Ar trebui să ștergi acest răspuns

Am vrut să actualizez acest lucru, deoarece l-am găsit în timp ce construiam propriul meu raport.
O metodă mai bună este să faci join-urile interne corecte, minimizând timpii de interogare:
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';
