[Tep-j-general] Re: ベストセラーの集計期間について

Back to archive index

Naomi Suzukawa suzuk****@bitsc*****
2004年 5月 16日 (日) 19:20:47 JST


杉本さん、こんにちは。
鈴川です。

過去1ヶ月間のベストセラーを表示したいと希望される方は、
他にもいらっしゃるかもしれないですね。

ベストセラーの期間集計は、SQL文を変更する必要があります。
次に示すSQL文で過去30日間のベストセラーを表示することができます。

[ファイル]
catalog/includes/boxes/best_sellers.php

** Line 13 - 17

[変更前]
  if (isset($current_category_id) && ($current_category_id > 0)) {
    $best_sellers_query = tep_db_query("select distinct p.products_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_CATEGORIES . " c where p.products_status = '1' and p.products_ordered > 0 and p.products_id = pd.products_id and pd.language_id = '" . $languages_id . "' and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id and '" . $current_category_id . "' in (c.categories_id, c.parent_id) order by p.products_ordered desc, pd.products_name limit " . MAX_DISPLAY_BESTSELLERS);
  } else {
    $best_sellers_query = tep_db_query("select distinct p.products_id, pd.products_name from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_status = '1' and p.products_ordered > 0 and p.products_id = pd.products_id and pd.language_id = '" . $languages_id . "' order by p.products_ordered desc, pd.products_name limit " . MAX_DISPLAY_BESTSELLERS);
  }

# products(商品テーブル)の
# products_ordered(ショップをオープンしてからの商品の累積販売数)で
# 降順に並べ替えてベストセラーを表示する。


[変更後]
  if (isset($current_category_id) && ($current_category_id > 0)) {
    $best_sellers_query = tep_db_query("select distinct p.products_id, pd.products_name, sum(op.products_quantity) as products_quantity from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c, " . TABLE_CATEGORIES . " c, " . TABLE_ORDERS . " o, " . TABLE_ORDERS_PRODUCTS . " op where op.products_id = p.products_id and op.orders_id = o.orders_id and o.date_purchased >= DATE_SUB(now(), INTERVAL 30 DAY) and p.products_status = '1' and p.products_ordered > 0 and p.products_id = pd.products_id and pd.language_id = '" . $languages_id . "' and p.products_id = p2c.products_id and p2c.categories_id = c.categories_id and '" . $current_category_id . "' in (c.categories_id, c.parent_id) group by op.products_id order by products_quantity desc, pd.products_name limit " . MAX_DISPLAY_BESTSELLERS);
  } else {
    $best_sellers_query = tep_db_query("select distinct p.products_id, pd.products_name, sum(op.products_quantity) as products_quantity from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_ORDERS . " o, " . TABLE_ORDERS_PRODUCTS . " op where op.products_id = p.products_id and op.orders_id = o.orders_id and o.date_purchased >= DATE_SUB(now(), INTERVAL 30 DAY) and p.products_status = '1' and p.products_ordered > 0 and p.products_id = pd.products_id and pd.language_id = '" . $languages_id . "' group by op.products_id order by products_quantity desc, pd.products_name limit " . MAX_DISPLAY_BESTSELLERS);
  }

# orders_products(受注商品テーブル)の
# date_purchased(受注日時)>=今よりも30日前で
# products_quantity(商品の注文数)を集計し
# それを降順に並べ替えてベストセラーを表示する。
#
#   過去30日間の指定をしているのは次の箇所です。
#   期間の変更をしたい場合は「30」を変えてください。
#     o.date_purchased >= DATE_SUB(now(), INTERVAL 30 DAY)

1ヶ月間の受注数が多い(対象とするレコード数が多い)場合は、
このSQL文を実行すると遅くなるかもしれません。
その場合は、テーブルの最適化やキャッシュの利用などの対策が
必要になると思います。

-- 
鈴川直美 / 株式会社ビットスコープ
E-mail: suzuk****@bitsc*****
http://www.bitscope.co.jp/





Tep-j-general メーリングリストの案内
Back to archive index