WooCommerce - Query per i prodotti ordinati

15 gen 2016, 23:19:35
Visualizzazioni: 20.6K
Voti: 2

Sto cercando di ottenere tutti gli ordini per un particolare giorno/ora e quindi i prodotti ordinati utilizzando SQL (MySQL) come mostrato nella query seguente:

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'

Sembra che quando provo a interrogare la tabella wp_woocommerce_order_itemmeta per i dati dei prodotti ordinati, perdo la connessione al database (timeout della connessione durante la query).

Qualche idea su cosa stia succedendo?

3
Commenti

Questo è un po' fuori tema dato che riguarda MySQL e WooCommerce ma non specificamente WordPress. Forse stai raggiungendo un limite e le tabelle sono troppo grandi o qualcosa del genere - non sono sicuramente un esperto di MySQL ma potresti provare a limitare i risultati con LIMIT a 1 o 2 e vedere se viene restituito qualcosa. Un'altra idea è usare COUNT() per contare il numero di righe che dovrebbero essere restituite.

Howdy_McGee Howdy_McGee
15 gen 2016 23:23:29

Ci sono solo 46 ordini per quel giorno quindi non dovrebbe essere un problema. Comunque proverò a contattare gli sviluppatori di WooCommerce sul forum di WP.

JackTheKnife JackTheKnife
15 gen 2016 23:25:54

Anche se vedi solo 46 ordini nel backend - potrebbe essere una query malformata che sta restituendo più risultati del previsto e questo potrebbe essere il cuore del problema - solo suggerimenti per escludere le piccole cose. Buona fortuna!

Howdy_McGee Howdy_McGee
15 gen 2016 23:41:56
Tutte le risposte alla domanda 2
2

Query corretta

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'

Spiegazione: L'ID del post non ha una relazione diretta con i metadati degli elementi dell'ordine

19 gen 2016 19:16:15
Commenti

SQL molto inefficiente, dovresti unire la tabella itemmeta invece del cross join. Dovresti eliminare questa risposta

xnagyg xnagyg
8 feb 2019 23:03:48

In una query aggregata senza GROUP BY, l'espressione #1 della lista SELECT contiene la colonna non aggregata 'p.ID'; questo è incompatibile con sql_mode=only_full_group_by

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

Volevo aggiornare questo, poiché l'ho trovato mentre sviluppavo il mio sistema di reporting.

Un metodo migliore è utilizzare i giusti inner join, riducendo i tempi di query:

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 mag 2017 05:03:12