Сводка (mySQL) покупок WooCommerce на членство в клубе - PullRequest
0 голосов
/ 05 ноября 2018

Я создаю две страницы "user admin" для наших клубов, чтобы они могли видеть, что каждый из их членов покупает в WooCommerce. Я выполнил большую часть запросов к MySQL, мне просто нужно закончить некоторые незначительные моменты (немного выше моей головы).

SELECT
    wp_users.ID,
    wp_users.display_name AS 'Name',
    wp_ihc_user_levels.level_id AS 'Roles',

    -- Check if User if full member or club visitor
    (CASE wp_usermeta.meta_key = 'club_member'
        WHEN wp_usermeta.meta_value LIKE 'Visitor' THEN 'Sponsored Visitor'
        WHEN wp_usermeta.meta_value LIKE 'Member' THEN 'Financial Member'
    END) AS 'Membership',

    -- Check if Member has purchased any items, by "category"
    (SELECT IF(COUNT(*) > 0, 'Yes', 'No') FROM wp_terms
            WHERE wp_users.ID AND name = 'Camping') AS 'Camping',
    (SELECT IF(COUNT(*) > 0, 'Yes', 'No') FROM wp_terms
            WHERE wp_users.ID AND name = 'Merchandise') AS 'Merchandise',
    (SELECT IF(COUNT(*) > 0, 'Yes', 'No') FROM wp_terms
            WHERE wp_users.ID AND name = 'Catering') AS 'Catering',
    (SELECT IF(COUNT(*) > 0, 'Yes', 'No') FROM wp_terms
            WHERE wp_users.ID AND name = 'Tickets') AS 'Tickets',

    -- Check if Member has booked any trips
    (SELECT IF(COUNT(*) > 0, 'Yes', 'No') FROM wp_em_bookings WHERE person_id = wp_users.ID) AS 'Trips'
FROM
    wp_users
    JOIN wp_usermeta ON wp_users.ID = wp_usermeta.user_id
    JOIN wp_ihc_user_levels ON wp_users.ID = wp_ihc_user_levels.user_id
WHERE
    wp_usermeta.meta_value = (SELECT MAX(CASE WHEN meta_key = 'affiliated_club' THEN meta_value END) FROM wp_usermeta WHERE user_id = '17')

Таким образом, SQL-запрос будет выполняться от имени user_id, вызвавшего запрос, затем он найдет всех остальных членов клуба в "affiliate_club" и выполнит запросы SELECT сверху.

Проблемы:

  1. Пользователь может иметь несколько ролей в "wp_ihc_user_levels.level_id", однако запрос возвращает 2 строки для "4" и "5" вместо CONCAT, то есть "4,5" в той же строке.
  2. CASE wp_usermeta.meta_key = 'club_member' возвращает «Посетитель» для всех записей, где есть несколько полноправных членов
  3. Я не уверен, какие таблицы WooCommerce мне нужно запросить, чтобы связать категории с каждой покупкой wp_users.ID для подсчета.

Во втором запросе мне нужно использовать «wp_users.ID», возвращенный из первого запроса, чтобы более детально раскрыть каждую покупку WooCommerce, отсортированную по категории.

Вероятно, я смогу выполнить большую часть второго запроса, если пойму еще один запрос WooCommerce.

Заранее спасибо.

ОБНОВЛЕНИЕ 1:

ОК, так что я смог разобраться с пунктом 1:

Изменено:

wp_ihc_user_levels.level_id AS 'Roles',

Кому:

(SELECT GROUP_CONCAT(level_id SEPARATOR ',')
    FROM wp_ihc_user_levels
    WHERE user_id = wp_users.ID) AS 'Roles',

Теперь «Роли» показывают значения «2,3,5» и т. Д. Вместо отдельных значений

ОБНОВЛЕНИЕ 2:

ОК, теперь у меня есть пункт 2:

Изменено:

(CASE wp_usermeta.meta_key = 'club_member'
    WHEN wp_usermeta.meta_value LIKE 'Visitor' THEN 'Sponsored Visitor'
    WHEN wp_usermeta.meta_value LIKE 'Member' THEN 'Financial Member'
END) AS 'Membership',

Кому:

(SELECT wp_usermeta.meta_value
    FROM wp_usermeta
    WHERE wp_usermeta.meta_key = 'club_member' AND wp_usermeta.user_id = wp_users.ID) AS 'Membership',

ОБНОВЛЕНИЕ 3: SQL-запрос завершен

Хорошо, так что это был либо чрезвычайно сложный запрос SQL, либо я все неправильно структурировал, но мое рабочее решение ниже.

ПРИМЕЧАНИЕ: Заполнитель% CURRENT_USER_ID% используется для вызова идентификатора текущего пользователя, если он существует в том же клубе, что и другие члены.

SELECT DISTINCT
    wpdc_users.ID,
    wpdc_users.display_name AS 'Name',

    (SELECT wpdc_usermeta.meta_value
        FROM wpdc_usermeta
        WHERE wpdc_usermeta.meta_key = 'club_member' AND wpdc_usermeta.user_id = wpdc_users.ID) AS 'Membership',

    (SELECT GROUP_CONCAT(level_id SEPARATOR ',')
        FROM wpdc_ihc_user_levels
        WHERE user_id = wpdc_users.ID) AS 'Roles',

    (SELECT
        IF(SUM(wpdc_terms.name = 'Camping')     >0, 'Yes', 'No')

    FROM
        wpdc_postmeta
        JOIN wpdc_woocommerce_order_items ON wpdc_woocommerce_order_items.order_id = wpdc_postmeta.post_id
        JOIN wpdc_woocommerce_order_itemmeta ON wpdc_woocommerce_order_items.order_item_id = wpdc_woocommerce_order_itemmeta.order_item_id
        JOIN wpdc_term_relationships ON wpdc_term_relationships.object_id = wpdc_woocommerce_order_itemmeta.meta_value
        JOIN wpdc_terms ON wpdc_terms.term_id = wpdc_term_relationships.term_taxonomy_id

    WHERE
        wpdc_postmeta.meta_key = '_customer_user'
        AND wpdc_woocommerce_order_itemmeta.meta_key = '_product_id'
        AND wpdc_term_relationships.object_id = wpdc_woocommerce_order_itemmeta.meta_value
        AND wpdc_terms.term_id = wpdc_term_relationships.term_taxonomy_id
        AND wpdc_terms.term_id > 23
        AND wpdc_postmeta.meta_value =  wpdc_users.ID) AS 'Camping',

    (SELECT
        IF(SUM(wpdc_terms.name = 'Catering')    >0, 'Yes', 'No')

    FROM
        wpdc_postmeta
        JOIN wpdc_woocommerce_order_items ON wpdc_woocommerce_order_items.order_id = wpdc_postmeta.post_id
        JOIN wpdc_woocommerce_order_itemmeta ON wpdc_woocommerce_order_items.order_item_id = wpdc_woocommerce_order_itemmeta.order_item_id
        JOIN wpdc_term_relationships ON wpdc_term_relationships.object_id = wpdc_woocommerce_order_itemmeta.meta_value
        JOIN wpdc_terms ON wpdc_terms.term_id = wpdc_term_relationships.term_taxonomy_id

    WHERE
        wpdc_postmeta.meta_key = '_customer_user'
        AND wpdc_woocommerce_order_itemmeta.meta_key = '_product_id'
        AND wpdc_term_relationships.object_id = wpdc_woocommerce_order_itemmeta.meta_value
        AND wpdc_terms.term_id = wpdc_term_relationships.term_taxonomy_id
        AND wpdc_terms.term_id > 23
        AND wpdc_postmeta.meta_value =  wpdc_users.ID) AS 'Catering',

    (SELECT
        IF(SUM(wpdc_terms.name = 'Merchandise') >0, 'Yes', 'No')

    FROM
        wpdc_postmeta
        JOIN wpdc_woocommerce_order_items ON wpdc_woocommerce_order_items.order_id = wpdc_postmeta.post_id
        JOIN wpdc_woocommerce_order_itemmeta ON wpdc_woocommerce_order_items.order_item_id = wpdc_woocommerce_order_itemmeta.order_item_id
        JOIN wpdc_term_relationships ON wpdc_term_relationships.object_id = wpdc_woocommerce_order_itemmeta.meta_value
        JOIN wpdc_terms ON wpdc_terms.term_id = wpdc_term_relationships.term_taxonomy_id

    WHERE
        wpdc_postmeta.meta_key = '_customer_user'
        AND wpdc_woocommerce_order_itemmeta.meta_key = '_product_id'
        AND wpdc_term_relationships.object_id = wpdc_woocommerce_order_itemmeta.meta_value
        AND wpdc_terms.term_id = wpdc_term_relationships.term_taxonomy_id
        AND wpdc_terms.term_id > 23
        AND wpdc_postmeta.meta_value =  wpdc_users.ID) AS 'Merchandise',

    (SELECT
        IF(SUM(wpdc_terms.name = 'Tickets')     >0, 'Yes', 'No')

    FROM
        wpdc_postmeta
        JOIN wpdc_woocommerce_order_items ON wpdc_woocommerce_order_items.order_id = wpdc_postmeta.post_id
        JOIN wpdc_woocommerce_order_itemmeta ON wpdc_woocommerce_order_items.order_item_id = wpdc_woocommerce_order_itemmeta.order_item_id
        JOIN wpdc_term_relationships ON wpdc_term_relationships.object_id = wpdc_woocommerce_order_itemmeta.meta_value
        JOIN wpdc_terms ON wpdc_terms.term_id = wpdc_term_relationships.term_taxonomy_id

    WHERE
        wpdc_postmeta.meta_key = '_customer_user'
        AND wpdc_woocommerce_order_itemmeta.meta_key = '_product_id'
        AND wpdc_term_relationships.object_id = wpdc_woocommerce_order_itemmeta.meta_value
        AND wpdc_terms.term_id = wpdc_term_relationships.term_taxonomy_id
        AND wpdc_terms.term_id > 23
        AND wpdc_postmeta.meta_value =  wpdc_users.ID) AS 'Tickets',

    (SELECT IF(COUNT(*) > 0, 'Yes', 'No') FROM wpdc_em_bookings WHERE person_id = wpdc_users.ID) AS 'Trips / Events'
FROM
    wpdc_users
    JOIN wpdc_usermeta ON wpdc_usermeta.user_id = wpdc_users.ID
    JOIN wpdc_ihc_user_levels ON wpdc_users.ID = wpdc_ihc_user_levels.user_id

WHERE
    wpdc_usermeta.meta_value = (SELECT MAX(CASE WHEN meta_key = 'affiliated_club' THEN meta_value END) FROM wpdc_usermeta WHERE user_id = %CURRENT_USER_ID%)

Я собираюсь отметить это как разрешенное, но был бы признателен, если бы кто-нибудь смог посоветовать, можно ли его сжать / свернуть для более эффективной проверки каждой покупки в категории.

Заранее спасибо.

1 Ответ

0 голосов
/ 11 ноября 2018

ОБНОВЛЕНИЕ 3: SQL-запрос завершен

Хорошо, так что это был либо чрезвычайно сложный запрос SQL, либо я все неправильно структурировал, но мое рабочее решение ниже.

ПРИМЕЧАНИЕ: Заполнитель% CURRENT_USER_ID% используется для вызова идентификатора текущего пользователя, если он существует в том же клубе, что и другие члены.

SELECT DISTINCT
    wp_users.ID,
    wp_users.display_name AS 'Name',

    (SELECT wp_usermeta.meta_value
        FROM wp_usermeta
        WHERE wp_usermeta.meta_key = 'club_member' AND wp_usermeta.user_id = wp_users.ID) AS 'Membership',

    (SELECT GROUP_CONCAT(level_id SEPARATOR ',')
        FROM wp_ihc_user_levels
        WHERE user_id = wp_users.ID) AS 'Roles',

    (SELECT
        IF(SUM(wp_terms.name = 'Camping')     >0, 'Yes', 'No')

    FROM
        wp_postmeta
        JOIN wp_woocommerce_order_items ON wp_woocommerce_order_items.order_id = wp_postmeta.post_id
        JOIN wp_woocommerce_order_itemmeta ON wp_woocommerce_order_items.order_item_id = wp_woocommerce_order_itemmeta.order_item_id
        JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_woocommerce_order_itemmeta.meta_value
        JOIN wp_terms ON wp_terms.term_id = wp_term_relationships.term_taxonomy_id

    WHERE
        wp_postmeta.meta_key = '_customer_user'
        AND wp_woocommerce_order_itemmeta.meta_key = '_product_id'
        AND wp_term_relationships.object_id = wp_woocommerce_order_itemmeta.meta_value
        AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
        AND wp_terms.term_id > 23
        AND wp_postmeta.meta_value =  wp_users.ID) AS 'Camping',

    (SELECT
        IF(SUM(wp_terms.name = 'Catering')    >0, 'Yes', 'No')

    FROM
        wp_postmeta
        JOIN wp_woocommerce_order_items ON wp_woocommerce_order_items.order_id = wp_postmeta.post_id
        JOIN wp_woocommerce_order_itemmeta ON wp_woocommerce_order_items.order_item_id = wp_woocommerce_order_itemmeta.order_item_id
        JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_woocommerce_order_itemmeta.meta_value
        JOIN wp_terms ON wp_terms.term_id = wp_term_relationships.term_taxonomy_id

    WHERE
        wp_postmeta.meta_key = '_customer_user'
        AND wp_woocommerce_order_itemmeta.meta_key = '_product_id'
        AND wp_term_relationships.object_id = wp_woocommerce_order_itemmeta.meta_value
        AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
        AND wp_terms.term_id > 23
        AND wp_postmeta.meta_value =  wp_users.ID) AS 'Catering',

    (SELECT
        IF(SUM(wp_terms.name = 'Merchandise') >0, 'Yes', 'No')

    FROM
        wp_postmeta
        JOIN wp_woocommerce_order_items ON wp_woocommerce_order_items.order_id = wp_postmeta.post_id
        JOIN wp_woocommerce_order_itemmeta ON wp_woocommerce_order_items.order_item_id = wp_woocommerce_order_itemmeta.order_item_id
        JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_woocommerce_order_itemmeta.meta_value
        JOIN wp_terms ON wp_terms.term_id = wp_term_relationships.term_taxonomy_id

    WHERE
        wp_postmeta.meta_key = '_customer_user'
        AND wp_woocommerce_order_itemmeta.meta_key = '_product_id'
        AND wp_term_relationships.object_id = wp_woocommerce_order_itemmeta.meta_value
        AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
        AND wp_terms.term_id > 23
        AND wp_postmeta.meta_value =  wp_users.ID) AS 'Merchandise',

    (SELECT
        IF(SUM(wp_terms.name = 'Tickets')     >0, 'Yes', 'No')

    FROM
        wp_postmeta
        JOIN wp_woocommerce_order_items ON wp_woocommerce_order_items.order_id = wp_postmeta.post_id
        JOIN wp_woocommerce_order_itemmeta ON wp_woocommerce_order_items.order_item_id = wp_woocommerce_order_itemmeta.order_item_id
        JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_woocommerce_order_itemmeta.meta_value
        JOIN wp_terms ON wp_terms.term_id = wp_term_relationships.term_taxonomy_id

    WHERE
        wp_postmeta.meta_key = '_customer_user'
        AND wp_woocommerce_order_itemmeta.meta_key = '_product_id'
        AND wp_term_relationships.object_id = wp_woocommerce_order_itemmeta.meta_value
        AND wp_terms.term_id = wp_term_relationships.term_taxonomy_id
        AND wp_terms.term_id > 23
        AND wp_postmeta.meta_value =  wp_users.ID) AS 'Tickets',

    (SELECT IF(COUNT(*) > 0, 'Yes', 'No') FROM wp_em_bookings WHERE person_id = wp_users.ID) AS 'Trips / Events'
FROM
    wp_users
    JOIN wp_usermeta ON wp_usermeta.user_id = wp_users.ID
    JOIN wp_ihc_user_levels ON wp_users.ID = wp_ihc_user_levels.user_id

WHERE
    wp_usermeta.meta_value = (SELECT MAX(CASE WHEN meta_key = 'affiliated_club' THEN meta_value END) FROM wp_usermeta WHERE user_id = %CURRENT_USER_ID%)

Я собираюсь отметить это как разрешенное, но был бы признателен, если бы кто-нибудь смог посоветовать, можно ли его уплотнить / свести к минимуму для более эффективной проверки каждой покупки в категории.

Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...