WooCommerce - Interogare pentru produsele comandate

15 ian. 2016, 23:19:35
Vizualizări: 20.6K
Voturi: 2

Î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ă?

3
Comentarii

Aceasta este un pic off-topic deoarece este despre MySQL și WooCommerce, dar nu specifice WordPress. Poate ai atins o limită și tabelele sunt prea mari sau ceva de genul - cu siguranță nu sunt un expert în MySQL, dar poate încerci să LIMITezi rezultatele la 1 sau 2 și vezi dacă se returnează ceva. O altă idee ar fi să folosești COUNT() pentru a număra rândurile pe care le așteaptă să le returneze.

Howdy_McGee Howdy_McGee
15 ian. 2016 23:23:29

Sunt doar 46 comenzi pentru acea zi, deci nu ar trebui să fie o problemă. Oricum, voi încerca să contactez dezvoltatorii WooCommerce pe forumul WP.

JackTheKnife JackTheKnife
15 ian. 2016 23:25:54

Chiar dacă vezi doar 46 comenzi în backend - ar putea fi o interogare malformată care returnează mai multe rezultate decât te-ai aștepta, iar aceasta ar putea fi problema de bază - doar sugestii pentru a elimina lucrurile mici. Mult succes!

Howdy_McGee Howdy_McGee
15 ian. 2016 23:41:56
Toate răspunsurile la întrebare 2
2

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ă

19 ian. 2016 19:16:15
Comentarii

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

xnagyg xnagyg
8 feb. 2019 23:03:48

În interogarea agregată fără GROUP BY, expresia #1 din lista SELECT conține coloana neagregată 'p.ID'; aceasta este incompatibilă cu sql_mode=only_full_group_by

Olaf Erlandsen Olaf Erlandsen
11 mai 2019 08:04:03
0

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';
2 mai 2017 05:03:12