Я пытаюсь получить все продукты от базы данных с единым запросом. Я застреваю в ценовой части:
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
Обновлено:
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
Вы можете использовать оператор 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