我的报告显示了所售产品以及每种产品的总重量。以下是显示总重量的代码标记:
$weightsql = 'select op.products_name, sum(op.products_quantity * p.products_weight) as weightsum from ' . TABLE_ORDERS_PRODUCTS . ' op left join ' . TABLE_PRODUCTS . ' p on op.products_id = p.products_id where op.products_id = '.$pro['products_id'];
$weightq = tep_db_query( $weightsql );
while ($weight = tep_db_fetch_array( $weightq )){
if($category_parent_id != 0)$list_items[] = $weight['weightsum'];
}
它返回订购产品的值,但对于无序产品,它保持空白,这非常令人困惑。如何为无序产品(未从查询中提取的产品)返回0.00。
示例:
Product Name | Total Weight
|
Jelly Beans | 25.00
Soft Candy | This product has not been ordered, needs to show 0.00
Bubblegum | 10.00
答案 0 :(得分:1)
您正在寻找coalesce功能。
coalesce( sum(op.products_quantity * p.products_weight), 0 )
此外,将left join
更改为right join
,因为在您的查询product
位于order
右侧。
这会将Null值替换为0
。
已编辑到期OP评论。您可以添加具有所需样式的新列:
select
op.products_name,
coalesce( sum(op.products_quantity * p.products_weight), 0 ) as weightsum,
case when sum(op.products_quantity * p.products_weight) is NULL then 'Normal'
else 'Bold' end
as stype
...
答案 1 :(得分:0)
根据我对您的问题的理解:如果您想要来自TABLE_PRODUCTS
的所有行,以及来自TABLE_ORDERS_PRODUCTS
的匹配行(如果存在),则需要RIGHT JOIN
而不是LEFT JOIN
在您的查询中LEFT JOIN
。
但是,我希望尽可能使用... from ' . TABLE_PRODUCTS . ' p left join ' . TABLE_ORDERS_PRODUCTS . ' op ...
,所以我会在查询中重新排序表
<剪断>
IFNULL
< /剪断>
如果您的问题是您没有获得预期的行,那么这将解决问题。
另一个问题是处理OUTER JOIN返回的行返回的NULL值。快速回答是将这些表达式包装在... IFNULL( sum(op.products_quantity * p.products_weight) ,0.0) as ...
函数中以返回0(或0.00,如果需要小数类型)
<剪断>
... sum( IFNULL(op.products_quantity,0.0) * IFNULL(p.products_weight, 0.0) ) as
或
IF(op.products_id IS NULL,0,1) AS is_ordered
< /剪断>
问:如果我想将真值设为粗体,并将null值设为正常值,以识别已售出的产品,该怎么做呢?
A:
我希望您需要在生成的HTML中包含适当的< b> 和< / b> 标记。 (我们通常不会从数据库查询中返回这些类型的标记标记,因为很多标记通常由CSS处理。)
从数据库中,您可以在SELECT列表中包含一个表达式,以告知您是否在TABLE_ORDERS_PRODUCT表中找到匹配的行,如下所示:
products_id
如果在TABLE_ORDERS_PRODUCT表中找不到匹配的{{1}},那将返回0,否则返回1。
然后,您可以使用此值来确定应该将哪种样式或标记应用于您需要制作粗体的任何元素。