【问题标题】:Merge queries into one将查询合并为一个
【发布时间】:2013-04-21 22:06:02
【问题描述】:

我有下面的查询,它返回 OrderID、order_item_id、_product_id、Quantity。

SELECT `wp_woocommerce_order_items`.`order_id` AS 'OrderID',
    `wp_woocommerce_order_items`.`order_item_id`,
    MAX(CASE WHEN `wp_woocommerce_order_itemmeta`.`meta_key` = '_product_id' THEN `wp_woocommerce_order_itemmeta`.`meta_value` ELSE NULL END) AS '_product_id',
    MAX(CASE WHEN `wp_woocommerce_order_itemmeta`.`meta_key` = '_qty' THEN `wp_woocommerce_order_itemmeta`.`meta_value` ELSE NULL END) AS 'Quantity'
FROM `wp_woocommerce_order_items`, `wp_woocommerce_order_itemmeta`
WHERE `wp_woocommerce_order_items`.`order_id` = 50
AND `wp_woocommerce_order_items`.`order_item_id` = `wp_woocommerce_order_itemmeta`.`order_item_id`
AND `wp_woocommerce_order_items`.`order_item_type` = 'line_item'
AND (`wp_woocommerce_order_itemmeta`.`meta_key` = '_qty'
    OR `wp_woocommerce_order_itemmeta`.`meta_key` = '_product_id')
GROUP BY `wp_woocommerce_order_items`.`order_item_id`

返回:

+---------+---------------+-------------+----------+
| OrderID | order_item_id | _product_id | Quantity |
+---------+---------------+-------------+----------+
|      50 |            11 | 27          | 3        |
|      50 |            18 | 42          | 1        |
+---------+---------------+-------------+----------+

然后,我在 php 中遍历上述结果中的每一行,以使用下面查询中的 _product_id 来匹配 wp_postmeta.post_id

SELECT `post_id`,  
    MAX(CASE WHEN `wp_postmeta`.`meta_key` = '_sku' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS 'PartNumber',
    MAX(CASE WHEN `wp_postmeta`.`meta_key` = '_price' THEN `wp_postmeta`.`meta_value` ELSE NULL END) AS 'UnitPrice'
FROM `wp_postmeta`
WHERE `wp_postmeta`.`post_id` = $PRODUCT_ID
AND (`wp_postmeta`.`meta_key` = '_sku'
    OR `wp_postmeta`.`meta_key` = '_price')

返回:

+---------+------------+-----------+
| post_id | PartNumber | UnitPrice |
+---------+------------+-----------+
|      27 | MOO123     | 50        |
+---------+------------+-----------+

+---------+------------+-----------+
| post_id | PartNumber | UnitPrice |
+---------+------------+-----------+
|      42 | MOO345     | 145       |
+---------+------------+-----------+

有没有办法将两者结合起来,所以它将PartNumberUnitPrice添加到第一个查询结果并返回如下数据?

+---------+---------------+-------------+----------+------------+-----------+
| OrderID | order_item_id | _product_id | Quantity | PartNumber | UnitPrice |
+---------+---------------+-------------+----------+------------+-----------+
|      50 |            11 | 27          | 3        | MOO123     | 50        |
|      50 |            18 | 42          | 1        | MOO345     | 145       |
+---------+---------------+-------------+----------+------------+-----------+

在此处找到表数据:http://pastebin.com/3EN5P4fD

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    使用JOIN 语句怎么样?(请参阅下面关于JOIN 问题的脚注。

    SELECT `i`.`order_id` AS 'OrderID',
           `i`.`order_item_id`,
           @productID := (SELECT MAX(
                    CASE 
                        WHEN `meta_key` = '_product_id' 
                        THEN `meta_value` 
                        ELSE NULL 
                    END)
               FROM `wp_woocommerce_order_itemmeta`
              WHERE `order_item_id` = `i`.`order_item_id`
                AND (`meta_key` = '_qty'
                     OR `meta_key` = '_product_id')) AS '_product_id',
    
           (SELECT MAX(
                       CASE 
                           WHEN `meta_key` = '_qty' 
                           THEN `meta_value` 
                           ELSE NULL 
                       END) 
              FROM `wp_woocommerce_order_itemmeta`
             WHERE `order_item_id` = `i`.`order_item_id`
               AND (`meta_key` = '_qty'
                    OR `meta_key` = '_product_id')) AS 'Quantity',
    
           (SELECT MAX(
                       CASE 
                           WHEN `meta_key` = '_sku' 
                           THEN `meta_value` 
                           ELSE NULL 
                   END)
              FROM `wp_postmeta`
             WHERE `post_id` = @productID
               AND (`meta_key` = '_sku'
                    OR `meta_key` = '_price')) AS 'PartNumber',
    
           (SELECT MAX(
                       CASE 
                           WHEN `meta_key` = '_price' 
                           THEN `meta_value` 
                       ELSE NULL 
                   END)
              FROM `wp_postmeta`
             WHERE `post_id` = @productID
               AND (`meta_key` = '_sku'
                    OR `meta_key` = '_price')) AS 'UnitPrice'
    
     FROM `wp_woocommerce_order_items` AS `i` 
    WHERE `i`.`order_id` = 50
      AND `i`.`order_item_type` = 'line_item'
    GROUP BY `i`.`order_item_id`
    

    我没有测试过上面的语句,但它应该能让你开始。

    Stack Overflow 网站上还有另一篇文章:MySQL: Use CASE/ELSE value as join parameter,其中谈到使用 CASE 作为 JOIN 参数。看看吧!

    脚注:

    由于错误:“错误代码:1111。无效使用组函数”,我对 JOIN 语句的初始尝试失败。在阅读了MySQL LEFT JOIN, GROUP BY and ORDER BY not working as required 的帖子后,我将JOIN 语句更改为子查询。

    【讨论】:

    • 我收到以下错误,有什么想法吗? #1054 - “where 子句”中的未知列“wp_postmeta.meta_key”。谢谢
    • 请查看我对查询的编辑。我将wp_postmeta 更改为p
    • 新错误:#1111 - 无效使用组函数。再次感谢。
    • 在不了解您的表结构和/或示例数据的情况下,很难更正我自己的查询或从其他用户那里获得更准确的答案。请为我们发布此信息。
    • 我将创建表sql并发布它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多