2010-08-05 4 views
1

Я пытаюсь получить все продукты из базы данных одним запросом. Я застрял в ценовой части:Получить продукты из базы данных

У VirtueMart есть таблица с именем #__vm_product, а другая - #__vm_product_price.

Если продукт имеет родительский продукт, это означает, что продукт наследует все от родителя, если в нем не задано иное.

таблиц выглядеть следующим образом:

/* #__vm_product PARTIAL */ 
int - product_id 
int - product_parent_id 
varchar - product_name 

/* #__vm_product_price PARTIAL */ 
int - product_id 
decimal - product_price 
int - mdate 

Я сделал следующий запрос, который получает все продукты с их ценой:

SELECT 
p.product_id AS id, 
product_name AS name, 
product_price AS price, 
p.product_parent_id AS parent, 
MAX(pp.mdate) AS last_updated 

FROM jos_vm_product p 
LEFT JOIN jos_vm_product_price pp ON p.product_id = pp.product_id 

GROUP BY p.product_id 
ORDER BY p.product_id 

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

Может ли кто-нибудь помочь мне с этим?

Примечание: Если кто-нибудь знает более простой способ, чтобы получить все продукты (с ценой) из базы данных VirtueMart, пожалуйста, не возражаю, чтобы сказать мне :)

EDIT: Цена никогда не нулевой. Если ребенок должен наследовать от своего родителя, у него просто нет ценового ряда в jos_vm_product_price

ответ

1

Обновлено:

select 
    p.product_id AS id, 
    p.product_name AS name, 
    coalesce(pp.product_price, pp2.product_price) AS price, 
    p.product_parent_id AS parent, 
    coalesce(pp.mdate, pp2.mdate) AS last_updated 
from jos_vm_product p 
left outer join jos_vm_product p2 on p.product_parent_id = p2.product_id 
left outer join (
    select product_id, max(mdate) as maxmdate 
    from jos_vm_product_price 
    group by product_id 
) ppm on p.product_id = ppm.product_id 
left outer join jos_vm_product_price pp on ppm.product_id = pp.product_id and ppm.maxmdate = pp.mdate 
left outer join (
    select product_id, max(mdate) as maxmdate 
    from jos_vm_product_price 
    group by product_id 
) ppm2 on p2.product_id = ppm2.product_id 
left outer join jos_vm_product_price pp2 on ppm2.product_id = pp2.product_id and ppm2.maxmdate = pp2.mdate 
+0

Я не уверен, как исправить этот запрос. Он также не использует jos_vm_product_price, из-за чего мне трудно найти, какой из них должен быть ценовой таблицей. – MrSoundless

+0

Извините, он возвращает только дочерние продукты. Также прочитайте примечание EDIT в главном посте, потому что я сделал небольшую ошибку в своих объяснениях. – MrSoundless

+0

См. Мое обновление. Я предположил из вашего предыдущего текста, что все продукты, которые вы хотели, имели родителей. – RedFilter

1

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

Кроме того, вам нужно другое соединение, чтобы получить родителя.

SELECT 
     p.product_id AS id, 
     product_name AS name, 
     CASE 
      WHEN pp.product_price IS NULL then pp2.product_price 
      ELSE pp.product_price 
     END AS price, 
     p.product_parent_id AS parent, 
     MAX(pp.mdate) AS last_updated 

    FROM jos_vm_product p 
    LEFT OUTER JOIN jos_vm_product_price pp 
      ON p.product_id = pp.product_id 
     , jos_vm_product parent 
     , jos_vm_product_price pp2 
    WHERE (p.product_parent_id = parent.product_id OR p.product_parent_id IS NULL) 
    AND (parent.product_id = pp2.product_id OR p.product_parent_id IS NULL) 
    GROUP BY 
     p.product_id, 
     product_name, 
     CASE 
      WHEN pp.product_price IS NULL then pp2.product_price 
      ELSE pp.product_price 
     END, 
     p.product_parent_id 
+0

Это не будет работать, потому что PRODUCT_PRICE не существует в jos_vm_product – MrSoundless

+0

@MrSoundless - Да, я обнаружил, что после того, приглядевшись. Проверьте последнее изменение. Я не тестировал его, поэтому возможны синтаксические ошибки. – dcp

+0

Спасибо! Это работало после нескольких небольших исправлений (parent_product_id должен быть product_parent_id и p.parent_product_id = 0 вместо p.parent_product_id IS NULL). – MrSoundless

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