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
4

2 回答 2

1

您正在寻找合并功能。

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

另外,更改left joinright 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
...
于 2012-12-20T16:28:38.200 回答
0

根据我对您的问题的了解:如果您想要来自 的所有行,以及来自TABLE_PRODUCTS的匹配行(如果存在)TABLE_ORDERS_PRODUCTS,那么您需要RIGHT JOIN而不是LEFT JOIN查询中的 a 。

但是,我更喜欢尽可能使用 a LEFT JOIN,因此我会重新排序查询中的表

<剪辑>

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

</snip>

如果您的问题是您没有得到您期望的行,那将解决问题。


另一个问题是处理从 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>


Q:如果我想让真值加粗,空值正常,来识别已售出的产品,怎么做?

A:

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

从数据库中,您可以在 SELECT 列表中包含一个表达式,让您知道是否在 TABLE_ORDERS_PRODUCT 表中找到了匹配的行,如下所示:

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

如果在 TABLE_ORDERS_PRODUCT 表中未找到匹配项,则返回 0 products_id,否则返回 1。

然后,您可以使用此值来确定应将哪种样式或标记应用于您需要加粗的任何元素。

于 2012-12-20T16:37:33.580 回答