2016-01-19 3 views
0

У меня есть запроссаз и как использовать значение из него

select 
    p.ID as order_id, 
    p.post_date, 
    i.order_item_id, 
    max(CASE WHEN im.meta_key = '_product_id' and i.order_item_id = im.order_item_id THEN im.meta_value END) as product_id, 
    max(CASE WHEN im.meta_key = '_qty' and i.order_item_id = im.order_item_id THEN im.meta_value END) as qty, 
    max(CASE WHEN prm.meta_key = '_sku' and im.meta_value = prm.post_id THEN prm.meta_value END) as sku, 
    max(CASE WHEN prm.meta_key = '_regular_price' and im.meta_value = prm.post_id THEN prm.meta_value END) as product_price 
from 
    wp_posts as p, 
    wp_postmeta as pm, 
    wp_woocommerce_order_items as i, 
    wp_woocommerce_order_itemmeta as im, 
    wp_postmeta as prm  
where 
    p.post_type = 'shop_order' 
    and p.ID = pm.post_id 
    and p.ID = i.order_id 
    and p.post_date BETWEEN '2016-01-14 00:00:00' AND '2016-01-14 23:59:59' 
    and p.post_status = 'wc-processing' 
    and p.ID = i.order_id 
    and i.order_item_id = im.order_item_id 
group by 
    p.ID 

, но я застрял на получение sku и product_price использования product_id (оба значения пришли в NULL), когда на PhpMyAdmin я буду делать поиск по его стоимости я могу получить SKU и цену продукта meta_value, а также другие значения для meta_key, расположенные в таблице wp_postmeta.

Основываясь на комментариях ниже и полезные стороны от ответа я сделал JOIN версии запроса, который работает, но медленно:

select 
    p.ID as order_id, 
    p.post_date, 
    i.order_item_id, 
    max(CASE WHEN im.meta_key = '_product_id' THEN im.meta_value END) as product_id, 
    max(CASE WHEN imq.meta_key = '_qty' THEN imq.meta_value END) as qty, 
    max(CASE WHEN prm.meta_key = '_sku' THEN prm.meta_value END) as sku, 
    max(CASE WHEN prm.meta_key = '_regular_price' THEN prm.meta_value END) as product_price 
from 
    wp_posts as p 
join 
    wp_postmeta as pm 
on 
    p.ID = pm.post_id 
join 
    wp_woocommerce_order_items as i 
on 
    p.ID = i.order_id 
join 
    wp_woocommerce_order_itemmeta as im 
on 
    i.order_item_id = im.order_item_id 
join 
    wp_woocommerce_order_itemmeta as imq 
on 
    i.order_item_id = imq.order_item_id 
join 
    wp_postmeta as prm 
on 
    im.meta_value = prm.post_id 
where 
    p.post_type = 'shop_order' 
    and p.post_date BETWEEN '2016-01-14 00:00:00' AND '2016-01-14 23:59:59' 
    and p.post_status = 'wc-processing' 
group by 
    p.ID 

Мой вопрос почему мне нужно создать JOIN для каждого CASE заявление - другой способ для примера qty возвращает значение как NULL.

+5

Научитесь использовать явный синтаксис 'JOIN'. Простое правило: * Никогда * не используйте запятые в предложении 'FROM'. –

+0

@GordonLinoff Я тоже попробовал JOIN, но тогда мне нужно ПРИСОЕДИНИТЬ несколько раз к тем же таблицам, и GoDaddy отключает соединения для такого типа запросов. – JackTheKnife

+0

@GordonLinoff Re запятой в разделе 'FROM' - что мне тогда следует использовать? – JackTheKnife

ответ

0

Ну, я закончил удаление инструкции CASE и двинулся в сторону явно JOIN синтаксис.

select 
    p.ID as order_id, 
    p.post_date, 
    i.order_item_id, 
    im.meta_value as product_id, 
    imq.meta_value as qty, 
    prm.meta_value as sku, 
    prp.meta_value as product_price 
from 
    wp_posts as p 
join 
    wp_postmeta as pm 
on 
    p.ID = pm.post_id 
join 
    wp_woocommerce_order_items as i 
on 
    p.ID = i.order_id 
join 
    wp_woocommerce_order_itemmeta as im 
on 
    i.order_item_id = im.order_item_id 
join 
    wp_woocommerce_order_itemmeta as imq 
on 
    i.order_item_id = imq.order_item_id 
join 
    wp_postmeta as prm 
on 
    im.meta_value = prm.post_id 
join 
    wp_postmeta as prp 
on 
    im.meta_value = prp.post_id 
where 
    p.post_type = 'shop_order' 
    and p.post_date BETWEEN '2016-01-14 00:00:00' AND '2016-01-14 23:59:59' 
    and p.post_status = 'wc-processing' 
    and im.meta_key = '_product_id' 
    and imq.meta_key = '_qty' 
    and prm.meta_key = '_sku' 
    and prp.meta_key = '_regular_price' 
group by 
    p.ID 

Благодаря spencer7593 за хорошие направления.

1

В запросе не существует предиката в wp_postmeta (псевдоним prm в запросе.) Таким образом, это операция перекрестного соединения. Выполнение перекрестного соединения действительно; но маловероятно, что это результат, который вы хотите.

Отсоедините синтаксис запятой старой школы для операции соединения. Используйте ключевое слово ANSI JOIN. И переместите предикаты соединения из предложения WHERE в соответствующее предложение ON.

Некоторые условные тесты в выражении CASE не нужны, поскольку они являются избыточными. Они всегда будут оценивать значение TRUE.

Запрос включает в себя этот предикат (в предложении WHERE)

i.order_item_id = im.order_item_id 

То же условие снова появляется в выражении СЛУЧАЙ:

CASE WHEN im.meta_key = '_product_id' and i.order_item_id = im.order_item_id THEN 

Там нет необходимости повторять, что условие в случае, выражение, потому что он будет оценивать значение TRUE для каждой возвращаемой строки.

CASE WHEN im.meta_key = '_product_id' THEN 

Учитывая «отсутствующий» предикат для объединения в wp_postmeta (с псевдонимом prm) ... и с учетом состояния мы видим в другом случае выражение

im.meta_value = prm.post_id 

Мы подозреваем что вы хотите включить это условие в качестве предиката соединения.

Отсутствие выборки строк, мы просто догадываемся. Моя догадка, что вы пытаетесь достичь, это результат что-то вроде этого:

SELECT p.id as order_id 
    , p.post_date 
    , i.order_item_id 
    , MAX(CASE WHEN im.meta_key = '_product_id'  THEN im.meta_value END) as product_id 
    , MAX(CASE WHEN im.meta_key = '_qty'   THEN im.meta_value END) as qty 
    , MAX(CASE WHEN prm.meta_key = '_sku'   THEN prm.meta_value END) as sku 
    , MAX(CASE WHEN prm.meta_key = '_regular_price' THEN prm.meta_value END) as product_price 
    FROM wp_posts p 
    JOIN wp_postmeta pm 
    ON pm.post_id = p.ID 
    JOIN wp_woocommerce_order_items i 
    ON i.order_id = p.ID 
    JOIN wp_woocommerce_order_itemmeta im 
    ON im.order_item_id = i.order_item_id 
    JOIN wp_postmeta as prm 
    ON prm.post_id = im.meta_value 
WHERE p.post_type = 'shop_order' 
    AND p.post_status = 'wc-processing' 
    AND p.post_date >= '2016-01-14' 
    AND p.post_date < '2016-01-15' 
GROUP BY p.ID 

Это не принимает во внимание возможность «недостающих» строк из prm, возможно, вы хотите использовать внешнюю операцию соединения ,

И с i.order_item_id в списке выбора, и случай выражения возвращающие значения из im, это выглядит, как вы можете включить i.order_item_id в пункте GROUP BY.

Но опять же, это только догадки.

+0

Спасибо, сэр! – JackTheKnife

+0

Нет подсказки, но 'qty' в этом случае приходит как NULL, когда он присутствовал в исходном запросе. – JackTheKnife

+1

Наиболее вероятным объяснением для возвращаемого значения NULL' qty' является операция внутреннего соединения с 'prm'. В 'prm' нет строки соответствия, с' im.meta_value'. Похоже, вам нужно только соединение для строк с '_product_id'. Используйте для разделения объединений на '_itemmeta', один для получения product_id. Добавьте еще одно соединение, чтобы получить только '_qty. – spencer7593

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