Autor Zpráva
igid26
Profil
Zdravím,
potreboval by som poradiť. Cez woocommerce eshop potrebujem zobrazovať položky objednávky samostatne a nie ako celú objednávku. Využil som na to nižšie uvedený kód. Dáta sa však načítavajú veľmi pomaly. Je možno to nejakým spôsobom prerobiť?

SELECT
    *
FROM (
    SELECT
        ID AS order_id,
        post_date,
        post_status
    FROM
        wp_posts
    WHERE
        post_type = 'shop_order'
) AS orders
LEFT JOIN (
    SELECT
        post_id AS order_id,
        MAX(CASE WHEN meta_key = '_billing_first_name' THEN meta_value END) AS _billing_first_name,
        MAX(CASE WHEN meta_key = '_billing_last_name' THEN meta_value END)  AS _billing_last_name,
        MAX(CASE WHEN meta_key = '_billing_company' THEN meta_value END)  AS _billing_company,
        MAX(CASE WHEN meta_key = '_billing_address_1' THEN meta_value END)  AS _billing_address_1,
        MAX(CASE WHEN meta_key = '_billing_address_2' THEN meta_value END)  AS _billing_address_2,
        MAX(CASE WHEN meta_key = '_billing_city' THEN meta_value END)       AS _billing_city,
        MAX(CASE WHEN meta_key = '_billing_state' THEN meta_value END)      AS _billing_state,
        MAX(CASE WHEN meta_key = '_billing_postcode' THEN meta_value END)   AS _billing_postcode,
        MAX(CASE WHEN meta_key = '_billing_phone' THEN meta_value END)      AS _billing_phone,
        MAX(CASE WHEN meta_key = '_billing_email' THEN meta_value END)      AS _billing_email,
        MAX(CASE WHEN meta_key = '_billing_country' THEN meta_value END)    AS _billing_country,
        MAX(CASE WHEN meta_key = '_order_total' THEN meta_value END)        AS order_total,
        MAX(CASE WHEN meta_key = '_order_tax' THEN meta_value END)          AS order_tax,
        MAX(CASE WHEN meta_key = 'Časopis' THEN meta_value END)          AS Časopis,
        MAX(CASE WHEN meta_key = 'mailchimp_woocommerce_is_subscribed' THEN meta_value END)          AS odber,
        MAX(CASE WHEN meta_key = '_paid_date' THEN meta_value END)          AS paid_date
    FROM
        wp_postmeta
    GROUP BY 
        post_id
) AS order_details
ON
    orders.order_id = order_details.order_id
LEFT JOIN (
    SELECT
        order_id,
        GROUP_CONCAT(order_item_name SEPARATOR ', ')           AS order_item_names,
        GROUP_CONCAT(order_items.order_item_id SEPARATOR ', ') AS order_item_ids,
        GROUP_CONCAT(order_item_type SEPARATOR ', ')           AS order_item_types,
        GROUP_CONCAT(productID SEPARATOR ', ')                 AS productIDs, -- asi je stejné jako order_item_ids, ale v query to máš, tak jsem to nechal i tady
        GROUP_CONCAT(Qty SEPARATOR ', ')                       AS Qty,
        SUM(lineTotal)                                         AS lineTotal,
        SUM(subtotal)                                          AS subtotal
    FROM
        wp_woocommerce_order_items AS order_items
    LEFT JOIN (
        SELECT
            order_item_id,
            MAX(CASE WHEN meta_key = '_product_id' THEN meta_value END)    AS productID,
            MAX(CASE WHEN meta_key = '_qty' THEN meta_value END)           AS Qty,
            MAX(CASE WHEN meta_key = '_line_total' THEN meta_value END)    AS lineTotal,
            MAX(CASE WHEN meta_key = '_line_subtotal' THEN meta_value END) AS subtotal
        FROM
            wp_woocommerce_order_itemmeta
        GROUP BY
            order_item_id
    ) AS order_items_details
    ON
        order_items.order_item_id = order_items_details.order_item_id
    WHERE
        order_item_type = 'line_item'
    GROUP BY
        order_id
) AS order_items_sumary
ON
    orders.order_id = order_items_sumary.order_id
ORDER BY
    `post_date` DESC
Kajman
Profil
Tipnul bych, že bude rychlejší rozdělení dotazu na jednotlivé části. Vybrání objednávek a k nim detaily. Bude to více programování v php, ale v dotazech se vyhnete počítání max(case a group_concat i pro položky, které vlastně nechcete.
Viz "Konstantní počet dotazů" na Srovnání dotazů do závislých tabulek

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0