2013-04-28 3 views
3

У меня есть запрос ниже, который возвращает 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  | 
+---------+------------+-----------+ 

Есть ли способ объединить два, так что это добавляет PartNumber и UnitPrice на первый результат запроса и возвращает данные, как показано ниже?

+---------+---------------+-------------+----------+------------+-----------+ 
| 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

Благодарность

ответ

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 Проверьте это

Сноска.!

Мои первоначальные попытки с JOIN утверждениями не удались из-за ошибки: «Код ошибки: 1111. Недопустимое использование групповой функции». Прочитав сообщение MySQL LEFT JOIN, GROUP BY and ORDER BY not working as required, я изменил операторы JOIN на подзапросы.

+0

Я получаю следующую ошибку, любые идеи? # 1054 - Неизвестный столбец 'wp_postmeta.meta_key' в 'where clause'. Спасибо – arbme

+0

См. Мое редактирование в запросе. Я изменил 'wp_postmeta' на' p'. – GregD

+0

Новая ошибка: # 1111 - Недопустимое использование групповой функции. Еще раз спасибо. – arbme

Смежные вопросы