商品カタログ「この商品を買った人は、こんな商品も買っています」の内部的な処理方法は?

このQ&Aのポイント
  • 商品カタログ「この商品を買った人は、こんな商品も買っています」の内部的な処理方法について教えてください。
  • バッチで裏で処理するのか、注文のたびに処理するのかについて知りたいです。
  • また、適切な設計方法があれば教えてください。
回答を見る
  • ベストアンサー

商品カタログ「この商品を買った人は、こんな商品も買っています」について

はじめまして。 商品データベースのカタログ表示の際のSQLの質問です。 www.amazon.co.jp のサイトでは、ある商品を選択すると、「この商品を買った人は、こんな商品も買っています」と表示されます。 この内部的な処理方法を教えてください。 例えば、以下のような単純なテーブルがあるとします。 ●顧客テーブル ・顧客番号 ・顧客名 ●商品テーブル ・商品ID ・商品名 ・販売単価 ●注文テーブル ・注文番号 ・注文日時 ・顧客番号 ・小計 ●注文詳細テーブル ・注文番号 ・注文詳細番号 ・商品ID ・数量 このような設計の場合、「ある商品を買った人は、こんな商品も買っています」を実現するために ・バッチで裏で処理するのでしょうか?それとも注文のたびに処理するのでしょうか? ・どのテーブルに、保存するのでしょうか? ・どのようなSQL文になりますか?(具体的に教えてください) また、別の適切な設計方法があるのでしょうか? 困っています・・・ お手数ですがよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。  それは、いろいろ方法がありますよ。  店舗の目的、つまり「客に買わせること」を考えると、本当に他の客が買ったものを表示する必要はなく、何らかのカテゴリで一致するものを表示させればいいですよね。「他の人はこんなのも一緒に買っているけど、あなたはどう?」と聞かれると、心が動くものです。 ~~~ 商品テーブルに「カテゴリ」を追加し、「カテゴリテーブル」を追加する。カテゴリテーブルは、必要なら自己参照して階層化する。 ~~~  次に、いくつかの商品をまとめ買いできる(たいていそうでしょうけど)なら、まとめ買いした商品を並べるようにすればいいわけです。まさしく「こんな商品も買っています」となりますね。これは「注文テーブル」と「注文詳細テーブル」から、現在買おうとしている商品コードを検索し、一緒に買ったものをもう一度検索すればいいわけです。 ~~こんな感じ(未検証) SELECT "商品テーブル"."商品名" FROM "商品テーブル", "注文テーブル", "注文詳細テーブル" "現在の商品", "注文詳細テーブル" "一緒に買った商品" WHERE "現在の商品"."商品ID" = [今表示している商品のID] AND "現在の商品"."注文番号" = "注文テーブル"."注文番号" AND "一緒に買った商品"."注文番号" = "注文テーブル"."注文番号" AND "一緒に買った商品"."商品ID" = "商品テーブル"."商品ID" ~~Oracle9.2を想定  1つ目と2つ目を組み合わせ、より「的確度」を高めることができます。または、2つ目でヒットがなければ1つ目で表示するという手もあります。  また、もう一つ注意しなければならないのが特許です。簡単に思いつきそうなのでとれていないかもしれませんが、「他の人が一緒に買ったものを表示する」ことについて特許がとられていれば、同じようなことをすることはできません。または特許料を払う必要があります。  あと、人から聞いてものを業務で使うときは、ちゃんと理解してからにしてくださいね。何らかの不具合があったとき、直すのは“あなた”なのですから。

snake103
質問者

お礼

ご回答有難う御座います。 大変参考になりました。 自分の中で曖昧だった部分がすっきりと晴れました。 とても、感謝しております。 (追申) この質問用途用のダミーなカテゴリーを使用している方も いらっしゃるのでしょうか?(具体的なアイデアありましたらお聞かせください) 私はこんな別の方法を使っているという方がいましたらぜひお聞かせください。

関連するQ&A

  • Access DB 商品名の扱いについて

    (テーブル名):(フィールド名) 商品テーブル:商品名。 単価数量テーブル:商品単価、数量、仕入番号、商品名。 仕入テーブル:仕入番号、仕入日、注文日、手数料、輸送費など。 売上テーブル:売上、販売日付、仕入番号、商品名。 リレーションシップ:一対多 商品テーブル商品名-単価数量テーブル商品名 商品テーブル商品名-売上テーブル商品名 仕入テーブル仕入番号-売上テーブル仕入番号 仕入テーブル仕入番号-単価数量テーブル仕入番号 このように作成しました。 ここで問題なのが、商品名の入力です。 仕入テーブルをメイン、単価数量テーブルをサブフォームにしてフォームを作成しました。 さて、商品名を単価数量テーブル商品名フィールドのサブフォームから入力・・・と思ったら、商品テーブル商品名フィールドに名前がないためエラーが出ます。(参照整合性をしているため) サブフォームの入力フィールドを商品テーブル商品名に変更すれば入力できます。 しかし、重複した商品名を入力できません(重複しないに設定しているため) 何故このようなことをするか?ですが、同じ商品でも購入日が違えば単価が違う場合があります。 ですので単価数量テーブルでは同じ商品名を使用する必要があります。 しかし、商品テーブルでは同じ商品名は必要ありません。 もちろん先に商品テーブルに商品名を入力すれば問題ありませんが、入力効率から言って問題あります。 さてここで質問なのですが、一対多の多から商品名を入力して一側に反映できないでしょうか? 一側にすでに同じ商品名がある場合は反映してはいけません。 ちないにVBAやSQLはコピペぐらいはできますが、書けませんのでご了承を。

  • Access リレーションとデータの参照について

    パソコンはアクセスとエクセルマクロの入門書を読み終えたレベルです。 只今、注文実績管理をする為にアクセスを構築していますが思うようにできません。 職場でPCの相談する相手がいないため、大変困っています。どなたかお知恵をください。 相談の内容ですが、【C】の注文テーブルにある「注文番号」と「数量」と「日付」で 期間中の発注実績の集計をしたいと考えています。 【B】と【C】がまったく関連付けることができません。 【A】顧客テーブル    (1)ID(オートナンバー)    (2)発注コード    (3)氏名     (注)顧客テーブルにある「発注コード」がローマ字と数字の組み合わせで        、これでリレーションシップを設定したいのです。 【B】商品テーブル    (1)ID(オートナンバー)    (2)注文番号    (3)品名    (4)金額 【C】注文テーブル    (1)ID(オートナンバー)    (2)発注コード    (3)日付    (4)氏名    (5)注文番号1    (6)注文番号1(数量)    (7)注文番号2    (8)注文番号2(数量)    (9)注文番号3    (10)注文番号3(数量)     ・     ・     ・     注文番号50     注文番号50(数量)

  • ファイルメーカー 同一IDと日付への番号振り当て

    Aテーブル(伝票)とBテーブル(明細1商品で1レコード)があり A 受注シリアル 日付 顧客ID 合計金額 B 受注シリアル 受注ID 日付 商品名 色 数 小計 フィールドがあり 受注シリアルでリレーションをはり、AにBの内容(商品名、数、色など)をポータル表示させようと考えております。 今回の質問は今まで一つのテーブルで作業をしていたので一度2つのテーブルに別ける事にしました。 今までのデータをBテーブルのフィールド(顧客ID、日付、商品名、数、小計)へ振り分ける事はできたのですが、受注シリアルへ番号を振り分ける作業でつまづいてしまいました。 同日付と顧客IDに番号(受注シリアル)を振り当てるにはどうすればいいでしょうか? 現在Bテーブルに約20000レコードあります。 よろしくお願いいたします。

  • 第3正規形について

    平成27年秋期の基本情報技術者試験の問27 関係“注文記録”の属性間(1)~(6)の関数従属性があり,それに基づいて第3正規形まで正規化を行って, “商品”,“顧客”,“注文”,“注文明細”の各関係に分解した。関係“注文明細”として, 適切なものはどれか。ここで,{ X ,Y } は,属性 X と Y の組みを表し, X → Y は,X が Y を関数的に決定することを表す。また,実線の下線は主キーを表す。 注文記録(注文番号,注文日,顧客番号,顧客名,商品番号,商品名, 数量,販売単価) 〔関数従属性〕 (1) 注文番号 → 注文日                (2) 注文番号 → 顧客番号 (3) 顧客番号 → 顧客日                (4) {注文番号,商品番号} → 数量 (5) {注文番号,商品番号} → 販売単価      (6) 商品番号 → 商品名 ア 注文明細(注文番号,数量,販売単価) イ 注文明細(注文番号,顧客番号,数量,販売単価) ウ 注文明細(注文番号,顧客番号,商品番号,顧客名,数量,販売単価) エ 注文明細(注文番号,商品番号,数量,販売単価) 答えはエです。自分なりの解釈してみました。 ア:注文番号からわかるのは(1)、(2)より、注文日と顧客番号である。数量も販売単価も注文番号と商品番号の2つないとわからないので誤答。 イ:アと同じ理由 ウ:よくわかりません。。。 エ:商品番号と顧客番号から分かるのは数量と販売単価だから エがどうして」答えになるのかまたア~ウはどうして違うのか。 わかりやすく教えてください。

  • ACCESS

    どうか皆さんのお力添えを下さい。 ACCESS2010を利用して、以下の様な注文フォームaccdbを完成させていと考えています。現在、以下のところまで作業が進んでいます。 (1)テーブル (1) 注文履歴テーブル 注文ID・・・オートナンバー型 商品No・・・テキスト型 数量・・・数値型 (2) 商品テーブル 商品No・・・テキスト型 商品名・・・テキスト型 単価・・・通貨型 (3) 顧客テーブル 顧客ID・・・数値型 顧客名・・・テキスト型 パスワード・・・テキスト型 (2)フォーム (1)ログインフォーム 顧客ID入力用テキストボックス パスワード入力用テキストボックス ログインボタン・・・VBAを使って顧客テーブルに入っている顧客ID、パスワードが一致すれば注文フォームが開くところまではできました。 (2)注文フォーム(商品画像一覧があり、それをクリックすると商品No毎に個別に作成した注文フォームにジャンプします) ・コントロールボックスで数量を選ぶ ・注文ボタンを押すと注文履歴テーブルに商品ID、商品名、商品数が反映されます。 ここからが質問内容になります。 まず、はじめにログインフォームで入力後、照合OKになった顧客ID、パスワードを その後開いた注文フォームでの注文作業が完了、または中断するまでの間、 注文履歴に自動的に入力させ続けることはできますでしょうか?複数商品の注文が あった際は注文履歴テーブルにおいて複数レコードが連続して同じ顧客IDになるような 方法はあるでしょうか? ネット通販のようなものをイメージしております。 その他にもっと効率の良いやりかたなどあればご教授下さい。 どうぞよろしくお願いします。

  • ACCESSのテーブル設計とクエリ

    ACCESS初心者です。 ACCESS2010 OSはWindows7です。 パソコンはアクセスとエクセルマクロの入門書を読み終えたレベルです。 只今、注文実績管理表を作成するために、必要な情報を複数のテーブルに 分解してコード化していますが、関連付けできない為にデーターの参照ができません。 対応方法があれば教えていただくようお願いします。 どうしても実現したいので、テーブルの設計が間違えているかもしれませんが写真を掲載します。 ■現在の状況と質問 A)商品だけで300アイテムあります。リストを見ながら商品名と金額を入力するのは、膨大な時間を奪われるので、発注書に書かれている。4ケタの商品番号と注文数量の入力のみに したい。その後に入力した4ケタの数字でデーターを集計し、分析業務につなげていきたい B)【C】と【D】は注文書のイメージです。ひとり最大50個の商品を一枚の注文書で 発注します(ひとりの注文が1か月に1~3回)。一回の注文で最大、50品目のデーターを 格納することは、アクセスで可能なのでしょうか? C)発注実績の抽出ですが、以下内容で実行したいです。どうすれば可能でしょうか?   テーブルの設計と関連付け、リレーションの設定がわかりません。   i)個人別の1か月注文実績。商品名、注文合計数、合計金額を商品別に表示   ii)個人別の注文合計金額(月、年間)の集計。   iii)商品Aの注文実績(月、年間) D)リレーションの状態。 【A】の(2)と【C】の(2)  【B】の(2)と【D】の(3)、(5)、(7)、(9)、(11)、(13)、(15)、(17)、(19)・・・ 【C】の(1)と【D】の(2)のみ参照整合性がとれています。 E)商品テーブルのドリルボタンを押して、下の階層を見ようとすると、画像のような メッセージがでます。これはなんなのでしょうか? ■現在の状況を列挙します。 【A】顧客テーブル (1)顧客ID(オートナンバー・・・長整数型) 主キー(2)発注コード(テキスト型)         ※発注コードは『英数字』のためテキスト型。リンク先も『テキスト型』 (3)氏名(テキスト型) 【B】商品テーブル (1)商品ID(オートナンバー・・・長整数型) 主キー(2)注文番号(数値型・・・倍精度浮動小数点型) (3)品名(テキスト型) (4)金額(通貨型) 【C】注文テーブル 主キー(1)注文ID(オートナンバー・・・長整数型)    (2)日付 (3)発注コード(テキスト型)        ※発注コードは『英数字』のためテキスト型。リンク元も『テキスト型』 【D】注文明細テーブル(注文番号は全て4ケタの数字です。重複Noはありません) 主キー(1)注文明細ID(オートナンバー型・・・長整数型) (2)注文ID(長整数型) (3)注文番号1(数値型・・・長整数型) (4)数量(注文番号1) (5)注文番号2 (6)数量(注文番号2) (7)注文番号3 (8)数量(注文番号3) (9)注文番号4 (10)数量(注文番号4) ・ ・ ・※注文番号50まで続く・・・

  • 注文した商品名をマスターで作るか

    Access 2013 vba 今工事のための材料の注文履歴を保存するテーブルと画面を作っています。 この商品名や、単価、仕入れ値などのデータは、管理テーブルを作成してそこで管理し、そこから商品IDを選択すると、注文履歴の画面にIDだけがセットされるような作りにしようと考えています。 【注文内容の入力画面A】 ・注文日 ・受注ID ・商品ID ・注文先ID ・単価 ・数量 ・単位 【商品管理テーブル】 ・商品ID ・メーカーID ・単価 ・品番 このようにすると、商品管理のテーブルのレコードを勝手に削除されたりした場合に、大変な事になることを考えると躊躇してしまいます。 商品管理のテーブルはあくまでも参照にとどめて、その商品名や品番などは、注文履歴を保存する画面のフィールドに保存したほうが良いか、迷っています。 この点で良いアドバイスがあれば、よろしくお願いします。

  • Access DLOOKUPについて

    Access DLOOKUPについて こんにちは。Access2010でのDlookupについてお教えください。 ■注文テーブル オーダーID,商品コード,数量,お店番号 001,A01,1,お店1号 001,A02,5,お店1号 002,B01,3,お店2号 002,B02,3,お店2号 ※同一オーダーIDで商品コードが重複する事は無 ■確認用注文テーブル 商品コード,数量,お店番号 A01ですよ,1お店1号 B02です,3,お店2号 ※なんと、オーダーIDがありません。さらに商品コードに変な文字列も入っています。 ■やりたい事 フォームに「判定」というテキストボックスを配置しました。 コントロールソースで以下の条件にあっているなら○、あっていないなら×と表示したいです。 ○注文テーブル.商品コードと確認用注文テーブル.商品コードを比較。 注文テーブル.商品コードのデータが確認用注文テーブル.商品コードに含まれていること。 ○注文テーブル.数量と確認用注文テーブル.数量がイコールであること。 ○注文テーブル.お店番号と確認用注文テーブル.お店番号がイコールであること。 これらを満たしていれば、○、満たしていなければ×と表示したいです。 Dlookupでなくても、何か他に方法がありましたらお教えください。 宜しくお願いします。

  • Access2007についての質問です

    Access2007を用いて、旅館の在庫管理をしたいのですが、 おおまかなイメージがつかず、手詰まり状態となってしまいました。 商品、商品注文、顧客のマスターを作成し、在庫テーブルを作ってクエリで現在在庫数を  現在在庫数: [総在庫数]-[現在出荷数]  のように表示させました。 各テーブルについては サービスマスター:ID、サービス名、価格 顧客マスター:ID、氏名、住所、電話番号 注文マスター:注文ID、顧客ID、サービス名、注文日、納品日 商品注文マスター:商品注文ID、顧客ID、商品名、注文日、納品日 商品マスター;商品ID,商品名、価格 となっています。 この後は、商品注文フォームから現在出荷数を随時更新できるようにしたいのですが どのように行うべきでしょうか。よろしくお願いします。

  • アクセス クエリ・集計・計算方法について

    アクセスの集計機能を使用して、品名毎の数量の合計と金額の合計を算出しようとしていますが、 思うようにできません。どなたか教えてください。 クエリのフィールドを左から・・・ (1)年月: Format([日付],"yyyy/mm")(集計:グループ化) (2)品名(集計:グループ化) (3)品名のカウント(集計機能:カウント) (4)単価(集計:グループ化) (5)金額: [単価]*[品名のカウント](集計:グループ化) このような形でクエリを実行していますが、すべての注文が1つだけなら問題ないのですが、実際には品名には数量が掛けられている場合もあり、現在設定しているクエリ設定では正しい数量の合計と金額の合計を出すことができません。どうか集計方法をご教授いただけないでしょうか。よろしくお願いします。 ■現在のテーブルの設計とリレーションを明記します。 【A】顧客テーブル (1)顧客ID (2)発注コード (3)氏名 【B】商品テーブル (1)商品ID (2)品名 (3)単価 【C】注文テーブル (1)注文ID (2)日付 (3)顧客ID 【D】注文明細テーブル (1)注文明細ID (2)注文ID (3)商品ID (4)数量 リレーション 【A】(1)-【C】(3) 【B】(1)-【D】(3) 【C】(1)-【D】(2)