另一个需要解释的奇怪问题,在此先感谢您的帮助。
我继承了一个 opencart 安装,并被要求修改一个报告生成器 (Product Export Express),该生成器运行一个大型 MySQL 查询,以输出一个包含所有相关产品信息以及其他数据花絮的 xls 文件。现在我正在使用以下代码:
<?php
ini_set("memory_limit","1G");
class ModelInventoryExpress extends Model
{
public function getProducts(){
$products_sql = "SELECT
p.product_id AS `Product ID`,
p.model AS `Model`,
p.sku as `SKU`,
pd.name AS `Product Name`,
cd.name as `Category`,
p.location AS `Location`,
p.quantity AS `Quanity`,
(SELECT `text`
FROM product_attribute pa
WHERE pa.product_id = p.product_id
AND pa.attribute_id = 6) AS `Box Count`,
(SELECT `text`
FROM product_attribute pa
WHERE pa.product_id = p.product_id
AND pa.attribute_id = 7) AS `Length`,
(SELECT `text`
FROM product_attribute pa
WHERE pa.product_id = p.product_id
AND pa.attribute_id = 5) AS `Ring Gauge`,
(SELECT `text`
FROM product_attribute pa
WHERE pa.product_id = p.product_id
AND pa.attribute_id = 4) AS `Strength`,
(SELECT `text`
FROM product_attribute pa
WHERE pa.product_id = p.product_id
AND pa.attribute_id = 3) AS `Wrapper`,
CASE
WHEN p.`status` = 1
THEN 'active'
ELSE 'non-active'
END AS `Status` ,
md.name as `Manufacturer`,
FORMAT(p.price, 2) as `Price`,
FORMAT(p.cost, 2) as `Cost`,
FORMAT(p.wholesale, 2) as `Wholesale`,
CASE
WHEN pts.`store_id` = 0
THEN 'StogieBoys.com'
WHEN pts.`store_id` = 1
THEN 'CigarHeist.com'
WHEN pts.`store_id` = 2
THEN 'm.stogieboys.com'
WHEN pts.`store_id` = 3
THEN 'BestCigarStuff.com'
WHEN pts.`store_id` = 6
THEN 'SBCigarWholesale.com'
WHEN pts.`store_id` = 8
THEN 'StogieTrade.com'
ELSE 'None'
END AS `Store`,
CASE
WHEN p.`is_dropshipped` = 1
THEN 'Yes'
ELSE 'No'
END AS `Is Dropshipped`
FROM
product p,
product_description pd,
product_to_category ptc,
category_description cd,
manufacturer md,
product_to_store pts
WHERE 1
AND p.product_id = pd.product_id
AND p.product_id = ptc.product_id
AND ptc.category_id = cd.category_id
AND p.manufacturer_id = md.manufacturer_id
AND p.product_id = pts.product_id
ORDER BY pd.name
";
$query = $this->db->query($products_sql);
return $query->rows;
}
}
在大多数情况下,这工作正常。它失败的地方是 store_id 部分。CASE 只会返回第一个匹配的值,然后进入下一位。我需要它来匹配并列出产品可能出现的所有商店,就像它对类别所做的一样。
当上述方法不起作用时,我尝试将其设置为像 AS '类别' 有点像这样:
s.name as `Store`,
CASE
WHEN p.`is_dropshipped` = 1
THEN 'Yes'
ELSE 'No'
END AS `Is Dropshipped`
FROM
product p,
product_description pd,
product_to_category ptc,
category_description cd,
manufacturer md,
store s,
product_to_store pts
WHERE 1
AND p.product_id = pd.product_id
AND p.product_id = ptc.product_id
AND ptc.category_id = cd.category_id
AND p.manufacturer_id = md.manufacturer_id
AND p.product_id = pts.product_id
AND pts.store_id = s.store_id
ORDER BY pd.name
但这并没有按预期工作,因为在存储表中,默认存储为 0,并且该表以多存储设置的其他存储开始。IE 1 等等,但没有列出默认值,或者 0 存储。
设计此查询以获得我希望的结果的最佳方法是什么?