简体   繁体   English

SQL 用子标题显示产品的父标题

[英]SQL Display the parent title of the product with the child title

Good day,再会,

I have a woocommerce eshop in which I do not use variants... all products are simple.我有一个 woocommerce 网上商店,我不使用变体……所有产品都很简单。 But for partner shops I need to create XML with variable products.但是对于合作伙伴商店,我需要使用可变产品创建 XML。

I have products that are not published are "hidden" (custom post status).我有未发布的产品是“隐藏的”(自定义发布状态)。

I also have "parent_sku" for custom field products where my parent product is specified.对于指定了我的父产品的自定义字段产品,我也有“parent_sku”。

I have a SQL code that extracts all the necessary products from the database and also sku and parent_sku我有一个 SQL 代码,它从数据库中提取所有必要的产品以及 sku 和 parent_sku

I would need to modify the SQL code to display the post_title of the parent product for the product variant.我需要修改 SQL 代码以显示产品变体的父产品的 post_title。

I enclose my SQL code and some pictures附上我的 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

my code show this table我的代码显示此表

IMG_1 IMG_1

I need to display a spreadsheet like this我需要显示这样的电子表格

IMG_2 IMG_2

thank you for any help <3谢谢你的帮助<3

My first approach would be something like this.我的第一种方法是这样的。 I can not test it cause I have no sample DB我无法测试它,因为我没有示例数据库

Make your sample SQL a subquery of a new query (it has parent SKU) Join with another subquery which contains parent SKU and the data you want.使您的示例 SQL 成为新查询的子查询(它具有父 SKU)与另一个包含父 SKU 和所需数据的子查询连接。 The main Query selects the fields in the desired order.主查询按所需顺序选择字段。

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

Check the performance of this, maybe moving grouping and ordering outside will become in a better performance.检查这个的性能,也许将分组和排序移到外面会变得更好。

I don't propose to make a subquery in a nested JOIN within original LEFT JOINS because I cannot test it and from here and now, I can't image how would react this "cross joining" with postmeta1 and postmeta6.我不建议在原始 LEFT JOINS 内的嵌套 JOIN 中进行子查询,因为我无法对其进行测试,并且从现在开始,我无法想象这种“交叉连接”与 postmeta1 和 postmeta6 的反应如何。

I recommend to implement some trigger and have sku and parent_sku fields in table wp_posts and you could do simple subquery with the table itself.我建议实现一些触发器并在表 wp_posts 中有 sku 和 parent_sku 字段,您可以对表本身进行简单的子查询。 In mySQL there is no hierarchical queries (until I know mySQL) like in Oracle, but maybe this helps to improve your query.在 mySQL 中没有像 Oracle 那样的分层查询(直到我知道 mySQL),但这可能有助于改进您的查询。 It's up to you.由你决定。

Sorry If this don't work on copy/paste, It's just an approach.抱歉,如果这不适用于复制/粘贴,这只是一种方法。

Edited with final functional SQL使用最终功能 SQL 编辑

my fully functional code我的功能齐全的代码

 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM