Получите продукты от базы данных

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

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, не возражайте, чтобы сказать мне :)

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

1
задан MrSoundless 5 August 2010 в 15:11
поделиться

2 ответа

Обновлено:

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
ответ дан 2 September 2019 в 22:24
поделиться

Вы можете использовать оператор 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
1
ответ дан 2 September 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: