2012-12-20 44 views
0

我有报告显示出售的产品以及每种产品的总重量。下面是代码的标记,显示总重量:在没有数据的情况下返回设定值

$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 

回答

1

您正在寻找coalesce功能。

coalesce(sum(op.products_quantity * p.products_weight), 0) 

此外,改变left joinright join因为在查询product是对order权。

这将取代空值到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 
... 
+0

感谢您的快速帮助,它会让我接受答案。 – user1879415

+0

如果我想将正确的值和正常的零值一起用于识别已售出的产品,那么将如何完成? – user1879415

+0

在帖子中回复。 @ user1879415,下一次为新问题写一个新帖子,不要改变问题要求。 – danihp

0

从我了解你的问题:从TABLE_PRODUCTSTABLE_ORDERS_PRODUCTS如果你希望所有的行,用匹配的行(如果有的话),你就需要RIGHT JOIN,而不是您可以使用所需的样式添加新列您的查询中有一个LEFT JOIN

不过,我更喜欢在查询中使用LEFT JOIN只要有可能,所以我会重新排序表

<剪断>

... from ' . TABLE_PRODUCTS . ' p left join ' . TABLE_ORDERS_PRODUCTS . ' op ... 

< /剪断>

这会解决问题,如果你的问题是你没有得到你期望的行。


另一个问题是处理由OUTER JOIN返回的行返回的NULL值。简单的回答有来包装这些表达式在IFNULL函数返回一个0(或0.00,如果你需要小数型)

<剪断>

... IFNULL(sum(op.products_quantity * p.products_weight) ,0.0) as ... 

... sum(IFNULL(op.products_quantity,0.0) * IFNULL(p.products_weight, 0.0)) as 

</snip>


问:如果我想将正确的值设为粗体,并且将空值作为正常值来识别已售出的产品,那么将如何完成?

答:

我希望你将需要在生成的HTML适当< B></B>标签。 (我们通常不会从数据库查询中返回这些类型的标记标记,因为很多标记通常由CSS处理。)

从数据库中,您可以在SELECT列表中包含表达式,让你知道,如果匹配的行中的TABLE_ORDERS_PRODUCT表或不被人发现,这样的事情:

IF(op.products_id IS NULL,0,1) AS is_ordered 

这会回报给你一个0,如果没有匹配的​​在TABLE_ORDERS_PRODUCT表被发现,否则它会返回一个1.

然后,您可以使用此值来确定什么样式或m arkup应该适用于你需要的任何元素来加粗。

+0

如果我想将正确的值作为正常的粗体和空值来识别已售出的产品,那么将如何完成? – user1879415

相关问题