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 joinします。right joinproductorder

これにより、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場合、 からの一致する行 (存在する場合) を使用するには、クエリではなく aTABLE_ORDERS_PRODUCTSが必要です。RIGHT JOINLEFT JOIN

ただし、LEFT JOIN可能な限り a を使用することを好むので、クエリ内のテーブルを並べ替えます

<中略>

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

</中略>

問題が期待する行を取得していない場合は、これで問題が解決します。


もう 1 つの問題は、OUTER JOIN によって返される行から返される NULL 値を処理することです。簡単な答えは、これらの式をIFNULL関数でラップして 0 (10 進数型が必要な場合は 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 

</中略>


Q: 販売された製品を認識するために、true 値を太字にし、null 値を通常の値にしたい場合、どのようにすればよいですか?

A:

生成された HTMLに適切な<b>および</b>タグを含める必要があると思います。(多くのマークアップは通常 CSS によって処理されるため、データベース クエリからこれらのタイプのマークアップ タグを返すことは通常ありません。)

データベースから、次のような式を SELECT リストに含めて、TABLE_ORDERS_PRODUCT テーブルに一致する行が見つかったかどうかを知らせることができます。

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

products_idTABLE_ORDERS_PRODUCT テーブルに一致するものが見つからない場合は 0 が返され、それ以外の場合は 1 が返されます。

次に、この値を使用して、太字にする必要がある要素に適用するスタイルまたはマークアップを決定できます。

于 2012-12-20T16:37:33.580 に答える