SQL Отображение родительского заголовка продукта с дочерним заголовком - PullRequest
0 голосов
/ 08 ноября 2019

Добрый день,

У меня есть интернет-магазин woocommerce, в котором я не использую варианты ... все продукты просты. Но для партнерских магазинов мне нужно создать XML с переменными продуктами.

У меня есть продукты, которые не публикуются как «скрытые» (пользовательский статус публикации).

У меня также есть «parent_sku» для пользовательскихполевые продукты, в которых указан мой родительский продукт.

У меня есть код SQL, который извлекает все необходимые продукты из базы данных, а также sku и parent_sku

Мне нужно изменить код SQL для отображенияpost_title родительского продукта для варианта продукта.

Я прилагаю свой код SQL и некоторые рисунки

    SELECT 
    wp_posts.post_title AS title,
    wp_posts.post_excerpt AS shortdesc,
    wp_posts.post_content AS longdesc,
    wp_postmeta1.meta_value AS sku,
    wp_postmeta6.meta_value AS parent_sku,
    wp_postmeta2.meta_value AS price,
    wp_posts1.guid AS img,
    wp_postmeta5.meta_value AS mall,
    GROUP_CONCAT( wp_terms.name ORDER BY wp_terms.name SEPARATOR ', ' ) AS product_categories
FROM wp_posts
LEFT JOIN wp_postmeta wp_postmeta1
    ON wp_postmeta1.post_id = wp_posts.ID
    AND wp_postmeta1.meta_key = '_sku'
LEFT JOIN wp_postmeta wp_postmeta2
    ON wp_postmeta2.post_id = wp_posts.ID
    AND wp_postmeta2.meta_key = '_regular_price'
LEFT JOIN wp_postmeta wp_postmeta3
    ON wp_postmeta3.post_id = wp_posts.ID
    AND wp_postmeta3.meta_key = '_thumbnail_id'
LEFT JOIN wp_posts wp_posts1
    ON wp_posts1.ID = wp_postmeta3.meta_value
    AND wp_posts1.post_type = 'attachment'
LEFT JOIN wp_postmeta wp_postmeta5
    ON wp_postmeta5.post_id = wp_posts.ID
    AND wp_postmeta5.meta_key = 'mall'
LEFT JOIN wp_postmeta wp_postmeta6
    ON wp_postmeta6.post_id = wp_posts.ID
    AND wp_postmeta6.meta_key = 'parent_sku'


LEFT JOIN wp_term_relationships
    ON wp_term_relationships.object_id = wp_posts.ID
LEFT JOIN wp_term_taxonomy
    ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
    AND wp_term_taxonomy.taxonomy = 'product_cat'
LEFT JOIN wp_terms
    ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_posts.post_type = 'product' AND ( wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'hidden') AND wp_postmeta5.meta_value = 'yes'
GROUP BY wp_posts.ID
ORDER BY sku ASC

мой код показывает эту таблицу

IMG_1

Мне нужно отобразить электронную таблицу, подобную этой

IMG_2

спасибо за любую помощь <3 </p>

Ответы [ 2 ]

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

мой полностью функциональный код

 SELECT baseSQL.title p_title, 
           parentSQL.title AS p_parent_title, -- second field in picture
           baseSQL.shortdesc AS p_shortdesc,
           baseSQL.longdesc AS p_longdesc,
           baseSQL.sku AS p_sku,
           baseSQL.parent_sku AS p_parent_sku,
           baseSQL.price AS p_price,
           baseSQL.img AS p_img,
           baseSQL.mall AS p_mall,
           baseSQL.product_categories AS p_categories
    FROM
      ( SELECT 
          wp_posts.post_title AS title,
          wp_posts.post_excerpt AS shortdesc,
          wp_posts.post_content AS longdesc,
          wp_postmeta1.meta_value AS sku,
          wp_postmeta6.meta_value AS parent_sku,
          wp_postmeta2.meta_value AS price,
          wp_posts1.guid AS img,
          wp_postmeta5.meta_value AS mall,
          GROUP_CONCAT( wp_terms.name ORDER BY wp_terms.name SEPARATOR ', ' ) AS product_categories
        FROM wp_posts
        LEFT JOIN wp_postmeta wp_postmeta1
          ON wp_postmeta1.post_id = wp_posts.ID
          AND wp_postmeta1.meta_key = '_sku'
        LEFT JOIN wp_postmeta wp_postmeta2
          ON wp_postmeta2.post_id = wp_posts.ID
          AND wp_postmeta2.meta_key = '_regular_price'
        LEFT JOIN wp_postmeta wp_postmeta3
          ON wp_postmeta3.post_id = wp_posts.ID
          AND wp_postmeta3.meta_key = '_thumbnail_id'
        LEFT JOIN wp_posts wp_posts1
          ON wp_posts1.ID = wp_postmeta3.meta_value
          AND wp_posts1.post_type = 'attachment'
        LEFT JOIN wp_postmeta wp_postmeta5
          ON wp_postmeta5.post_id = wp_posts.ID
          AND wp_postmeta5.meta_key = 'send'
        LEFT JOIN wp_postmeta wp_postmeta6
          ON wp_postmeta6.post_id = wp_posts.ID
          AND wp_postmeta6.meta_key = 'parent_plu'

        LEFT JOIN wp_term_relationships
          ON wp_term_relationships.object_id = wp_posts.ID
        LEFT JOIN wp_term_taxonomy
          ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
          AND wp_term_taxonomy.taxonomy = 'product_cat'
        LEFT JOIN wp_terms
          ON wp_term_taxonomy.term_id = wp_terms.term_id
        WHERE wp_posts.post_type = 'product' AND ( wp_posts.post_status = 'publish'
        OR wp_posts.post_status = 'hidden') AND wp_postmeta5.meta_value = 'yes'
        GROUP BY wp_posts.ID
        ORDER BY sku ASC
      ) baseSQL

    LEFT JOIN
      (
        SELECT 
          wp_posts.post_title AS title,
          wp_postmeta1.meta_value AS sku
        FROM wp_posts
        LEFT JOIN wp_postmeta wp_postmeta1
          ON wp_postmeta1.post_id = wp_posts.ID
          AND wp_postmeta1.meta_key = '_sku'
      ) parentSQL

    ON baseSQL.parent_sku = parentSQL.sku 
    AND baseSQL.parent_sku > 0

    GROUP BY baseSQL.sku
0 голосов
/ 08 ноября 2019

Мой первый подход будет примерно таким. Я не могу проверить это, потому что у меня нет образца DB

. Сделайте ваш пример SQL подзапросом нового запроса (у него есть родительский SKU). Присоединитесь к другому подзапросу, который содержит родительский SKU и данные, которые вы хотите. Основной запрос выбирает поля в нужном порядке.

SELECT baseSQL.title p_title, 
           parentSQL.title AS p_parent_title, -- second field in picture
           baseSQL.shortdesc AS p_shortdesc,
           baseSQL.longdesc AS p_longdesc,
           baseSQL.sku AS p_sku,
           baseSQL.parent_sku AS p_parent_sku,
           baseSQL.price AS p_price,
           baseSQL.img AS p_img,
           baseSQL.mall AS p_mall,
           baseSQL.product_categories AS p_categories
    FROM
      ( SELECT 
          wp_posts.post_title AS title,
          wp_posts.post_excerpt AS shortdesc,
          wp_posts.post_content AS longdesc,
          wp_postmeta1.meta_value AS sku,
          wp_postmeta6.meta_value AS parent_sku,
          wp_postmeta2.meta_value AS price,
          wp_posts1.guid AS img,
          wp_postmeta5.meta_value AS mall,
          GROUP_CONCAT( wp_terms.name ORDER BY wp_terms.name SEPARATOR ', ' ) AS product_categories
        FROM wp_posts
        LEFT JOIN wp_postmeta wp_postmeta1
          ON wp_postmeta1.post_id = wp_posts.ID
          AND wp_postmeta1.meta_key = '_sku'
        LEFT JOIN wp_postmeta wp_postmeta2
          ON wp_postmeta2.post_id = wp_posts.ID
          AND wp_postmeta2.meta_key = '_regular_price'
        LEFT JOIN wp_postmeta wp_postmeta3
          ON wp_postmeta3.post_id = wp_posts.ID
          AND wp_postmeta3.meta_key = '_thumbnail_id'
        LEFT JOIN wp_posts wp_posts1
          ON wp_posts1.ID = wp_postmeta3.meta_value
          AND wp_posts1.post_type = 'attachment'
        LEFT JOIN wp_postmeta wp_postmeta5
          ON wp_postmeta5.post_id = wp_posts.ID
          AND wp_postmeta5.meta_key = 'send'
        LEFT JOIN wp_postmeta wp_postmeta6
          ON wp_postmeta6.post_id = wp_posts.ID
          AND wp_postmeta6.meta_key = 'parent_plu'

        LEFT JOIN wp_term_relationships
          ON wp_term_relationships.object_id = wp_posts.ID
        LEFT JOIN wp_term_taxonomy
          ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
          AND wp_term_taxonomy.taxonomy = 'product_cat'
        LEFT JOIN wp_terms
          ON wp_term_taxonomy.term_id = wp_terms.term_id
        WHERE wp_posts.post_type = 'product' AND ( wp_posts.post_status = 'publish'
        OR wp_posts.post_status = 'hidden') AND wp_postmeta5.meta_value = 'yes'
        GROUP BY wp_posts.ID
        ORDER BY sku ASC
      ) baseSQL

    LEFT JOIN
      (
        SELECT 
          wp_posts.post_title AS title,
          wp_postmeta1.meta_value AS sku
        FROM wp_posts
        LEFT JOIN wp_postmeta wp_postmeta1
          ON wp_postmeta1.post_id = wp_posts.ID
          AND wp_postmeta1.meta_key = '_sku'
      ) parentSQL

    ON baseSQL.parent_sku = parentSQL.sku 
    AND baseSQL.parent_sku > 0
    GROUP BY baseSQL.sku

Проверьте производительность, возможно, перемещение группирования и упорядочивание за пределами станут более эффективными.

Я не предлагаюсделать подзапрос во вложенном JOIN в пределах оригинальных LEFT JOINS, потому что я не могу его протестировать, и отсюда и сейчас я не могу представить, как бы отреагировал это «перекрестное соединение» с postmeta1 и postmeta6.

Рекомендуюреализовать некоторый триггер и иметь поля sku и parent_sku в таблице wp_posts, и вы можете сделать простой подзапрос с самой таблицей. В mySQL нет иерархических запросов (пока я не знаю mySQL), как в Oracle, но, возможно, это поможет улучшить ваш запрос. Это зависит от вас.

Извините Если это не работает при копировании / вставке, это просто подход.

Отредактировано с помощью окончательного функционала SQL

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