Получить продукты из базы данных - PullRequest
1 голос
/ 05 августа 2010

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

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

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

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

/* #__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, пожалуйста, не стесняйтесь сообщить мне:)

РЕДАКТИРОВАТЬ: Цена никогда не бывает нулевой.Если ребенок должен наследовать от своего родителя, у него просто нет строки цены в jos_vm_product_price

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Обновлен:

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 
1 голос
/ 05 августа 2010

Вы можете использовать оператор 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
...