バージョン選択

フォーラム

メニュー

オンライン状況

40 人のユーザが現在オンラインです。 (36 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 40
もっと...

サイト内検索

その他 > その他 > ランキングSQL

その他

新規スレッドを追加する

スレッド表示 | 古いものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
lvsa
投稿日時: 2009/10/29 12:16
対応状況: −−−
一人前
登録日: 2009/10/6
居住地:
投稿: 104
Re: ランキングSQL
pinerayさま

いつもありがとうございます。

スゴイですね!!完璧です。
意図した通りの結果が得られました。

もっとSQL勉強しなくては・・

ホントに助かりました。ありがとうございます。
pineray
投稿日時: 2009/10/29 12:04
対応状況: −−−
長老
登録日: 2006/9/9
居住地: 伊賀
投稿: 292
Re: ランキングSQL
オススメ商品ブロックを参考にSQLを作成してみました。
取得するカラム名が変わっているので、そこは適宜修正してください。
SELECT od.product_id, count(*), name, price02_min, price01_min, main_list_image  
FROM dtb_order AS o 
INNER JOIN dtb_order_detail AS od 
 ON o.order_id = od.order_id 
INNER JOIN vw_products_allclass AS allcls using(product_id) 
WHERE customer_id in 
(
 SELECT 
  customer_id 
 FROM dtb_order AS o 
  INNER JOIN dtb_order_detail AS od ON o.order_id = od.order_id 
 WHERE product_id = $product_id
 AND o.create_date >= current_date - integer '360'
)
 AND allcls.status = 1 
GROUP BY od.product_id , name, price02_min, price01_min, main_list_image 
ORDER BY count(od.product_id) DESC, price02_min DESC 
LIMIT 5 OFFSET 0


----------------
EC-CUBEのプラグインを公開しています!
いつも reCAPTCHA

lvsa
投稿日時: 2009/10/29 11:52
対応状況: −−−
一人前
登録日: 2009/10/6
居住地:
投稿: 104
Re: ランキングSQL
pinerayさま

ご指摘ありがとうございます。
確かに現状のSQLだと、規格数によって
結果が違ってしまいますね・・。

ん〜・・何か良いSQLが思いつきません。
もう少し格闘してみます。
pineray
投稿日時: 2009/10/28 19:22
対応状況: −−−
長老
登録日: 2006/9/9
居住地: 伊賀
投稿: 292
Re: ランキングSQL
水を差すようで大変申し訳ないのですが、上記のSQLだと、
商品に複数の規格が登録されている場合、count 項目に記録される値が
「dtb_order_detailテーブルにあるproduct_idの数×規格数」になってしまい、
規格数の多寡で結果が変わってくるように思います。

だからといって、じゃあどういうSQLにすれば良いのか、
すぐには提示できないのですが ...

自分のスキルの無さを棚に上げながら揚げ足取りのようですみません。


----------------
EC-CUBEのプラグインを公開しています!
いつも reCAPTCHA

lvsa
投稿日時: 2009/10/28 19:06
対応状況: −−−
一人前
登録日: 2009/10/6
居住地:
投稿: 104
Re: ランキングSQL
ecbgさま

SQLの抽出条件ですが、以下の感じです。

1.カートに購入予定商品を入れる。
2.カート内の商品を過去1年以内に他のユーザが購入しているかを検索

SELECT 
 customer_id 
FROM dtb_order AS o 
INNER JOIN dtb_order_detail AS od ON o.order_id = od.order_id 
WHERE product_id = $product_id
 AND o.create_date >= current_date - integer '360'


それが上記部分です。

3.また、2の結果の商品が非表示、削除されていないかをチェックする意味で

AND p.status <> 2 AND p.status <> 3

してます。

あとは、2、3にて検索された商品のカウントとソート順を
価格で行いたかったので、GROUP BYを商品IDと価格で行っています。

こんな感じで伝わりますかね??

私自身、人に教えられるほどの知識がないので、わかりづらい部分は、突っ込んでくださいwww
ecbg
投稿日時: 2009/10/28 18:52
対応状況: −−−
仙人
登録日: 2009/2/25
居住地: 東京
投稿: 387
Re: ランキングSQL
lvsa様

すごいですね!!

私のSQL知識じゃなにが行われているのか、
ほとんど分らないのですが、買った商品に対して、
どういった条件の抽出になっているのですか?
popo
投稿日時: 2009/10/28 18:31
対応状況: −−−
長老
登録日: 2008/10/1
居住地:
投稿: 189
Re: ランキングSQL
lvsa様

「この商品を買った人は、こんな商品も買っています」と言う機能を導入したいと思っておりました。
完成しましたら、導入方法を御教授して頂けると嬉しく思います。

何卒、よろしくお願い致します。
lvsa
投稿日時: 2009/10/28 11:59
対応状況: −−−
一人前
登録日: 2009/10/6
居住地:
投稿: 104
Re: ランキングSQL
hogehogeさま

返信ありがとうございます。

>GROUP BY
> od.product_id
> ) AS ranking ON class.product_id = ranking.product_id

このような記述の仕方もできるのですね!大変参考になりました。
しかし・・SELECT結果は私の望むものではなかったです(泣)

↓↓↓↓↓↓結果↓↓↓↓↓↓
product_id | cnt | price01
------------+-----+---------
410 | 9 | 100
1 | 5 | 150
1 | 5 | 150
1 | 5 | 150
1 | 5 | 150

しかしながら、皆様のアドバイスを参考に試行錯誤した結果できました。
以下のようなSQLになりました。



SELECT
   od.product_id, count(*) , c.price02 
FROM dtb_order AS o 
INNER JOIN dtb_order_detail AS od 
	ON o.order_id = od.order_id 
INNER JOIN dtb_products_class AS c 
	ON od.product_id = c.product_id 
INNER JOIN dtb_products AS p 
	ON c.product_id = p.product_id 
WHERE customer_id in 
(
	SELECT 
		customer_id 
	FROM dtb_order AS o 
		INNER JOIN dtb_order_detail AS od ON o.order_id = od.order_id 
	WHERE product_id = $product_id
	AND o.create_date >= current_date - integer '360'
)
	AND p.status <> 2 AND p.status <> 3 
GROUP BY od.product_id , c.price02 
ORDER BY count(od.product_id) DESC, c.price02 DESC 
LIMIT 5 OFFSET 0


↓↓↓↓↓↓結果↓↓↓↓↓↓↓
product_id | count | price02
------------+-------+---------
1 | 45 | 120
410 | 9 | 100000
100 | 5 | 10000
3 | 4 | 100
407 | 4 | 2

アドバイスして頂きました皆様ありがとうございました。
hogehoge
投稿日時: 2009/10/28 11:05
対応状況: −−−
常連
登録日: 2008/9/19
居住地: Cusco,Peru
投稿: 67
Re: ランキングSQL
エラー内容:column reference "product_id" is ambiguous
の対処として、class.product_id は、正解だと思います。
ただ、countしてるのにGROUP BYが無いって怒られてるんですよね。

要するにこういうことでしょうか。


SELECT
    class.product_id,
    coalesce(cnt,0) as cnt,
    class.price01
FROM
    dtb_products_class AS class LEFT JOIN
 (SELECT
     od.product_id,
     count(*) as cnt
 FROM
     dtb_order AS o  INNER JOIN dtb_order_detail AS od   ON o.order_id = od.order_id
 WHERE
     customer_id in (SELECT
                         customer_id
                     FROM
                         dtb_order AS o   INNER JOIN dtb_order_detail AS od    ON o.order_id = od.order_id
                     WHERE
                         product_id = 2
                     )  AND
     o.create_date >= current_date - integer '360'
 GROUP BY
     od.product_id
 ) AS ranking ON class.product_id = ranking.product_id
ORDER BY
    cnt DESC     ,
    price01 DESC LIMIT 5 OFFSET 0;


なんか金額の扱いがおかしいような気が。。。
lvsa
投稿日時: 2009/10/28 10:07
対応状況: −−−
一人前
登録日: 2009/10/6
居住地:
投稿: 104
Re: ランキングSQL
pinerayさま

ありがとうございます。
返信遅くなりました・・・。

試してみましたが、今度は以下の部分がダメなようです。

SELECT
 product_id, count(*) AS cnt, price01
FROM dtb_products_class AS class
LEFT JOIN (
 SELECT
  product_id, count(*)
 FROM dtb_order AS o
 INNER JOIN dtb_order_detail AS od
  ON o.order_id = od.order_id
 WHERE customer_id in (
  SELECT customer_id FROM dtb_order AS o
  INNER JOIN dtb_order_detail AS od
   ON o.order_id = od.order_id
  WHERE product_id = 2)
 AND o.create_date >= current_date - integer '360'
 GROUP BY product_id) AS ranking
ON class.product_id = ranking.product_id
ORDER BY cnt DESC, price01 DESC
LIMIT 5 OFFSET 0;

エラー内容:column reference "product_id" is ambiguous
SELECT句のproduct_idがダメなようですね・・。
class.product_idやranking.product_id,dtb_products_class.product_idを試しても
column "class.product_id" must appear in the GROUP BY clause or be used in an aggregate function
とエラーになってしまいます。。。

どのようにしたら良いのでしょうか・・。
(1) 2 »
スレッド表示 | 古いものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBE公式 Amazon Payプラグイン

統計情報

総メンバー数は89,141名です
総投稿数は110,043件です

投稿数ランキング

1
seasoft
7367
2
468
3217
3
AMUAMU
2712
4
nanasess
2314
5
umebius
2085
6
yuh
1819
7
h_tanaka
1650
8
red
1570
9
mcontact
1298
10
tsuji
958
11
fukap
907
12
shutta
835
13
tao_s
799
14 ramrun 789
15 karin 689
16 sumida 641
17
homan
633
18 DELIGHT 572
19
patapata
502
20
flealog
485


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.