• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:SQL文作成についてお知恵をお貸しください)

商品とユーザーのマッチングSQL文作成

yambejpの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

#3の解釈については問題ないと思いますよ SQL文作成の流れとしては (1)ユーザーテーブル、アイテムテーブルもに存在するジャンルの数を数える select user_id,item_id,count(*) from user_genre as ug inner join item_genre as ig on ug.genre_id=ig.genre_id group by user_id,item_id; (2)ユーザーテーブルのユーザーごとのジャンル数を数える select user_id,count(*) from user_genre group by user_id; (3)この2つを突合し、user_idごとのカウント数が同じものを選ぶ 仮にitem_idが持ってないジャンルをuser_idが持っていた場合は(2)>(1)になる 逆にuser_idに持ってないジャンルをitem_idが持っている場合でも (1)で選別されているので(1)が(2)を超えることはない なお(1)と(2)の付け合わせの際には(1)の集計結果と(2)を比較するので 集計結果を利用して検索をする場合はルール上havingを利用するのが妥当。 もちろん(1)をサブクエリにして(2)とjoinしても同じ結果。

hogehuga09
質問者

お礼

なるほど。非常にわかりやすい解説ありがとうございます。 ホントに助かりました、ありがとうございました!

関連するQ&A

  • SQL おしえてくんさい

    ◆item_tbl item_id | shop_id ◆shop_tbl shop_id | status_flag (1:通常 2:潰れた) といったテーブルがあった場合に、item_tbl.shop_id はNULLの場合もある(店舗と紐づいていない場合もある)とします。 潰れた店舗の商品以外、つまりは「潰れてない店舗の商品」と「店舗と紐づいていない商品」のitem_idを取得したい場合のSQLを教えてください。

    • ベストアンサー
    • MySQL
  • 一度に関連する他のテーブルの行も取得したい

    MySQLバージョン4.1.16を使用しています。 ちょっとPHPも絡んでくるのですが、こちらのジャンルでお願いします。 テーブル「items」はテーブル「users」のuser_idカラムを 外部キーとして持っています。ここで「users」テーブルの行を取得して、 その値(user_idのaaaaやbbbbなど)を利用して 「items」テーブルのそれぞれ対応する行を取得したいのですが、 $users = (usersテーブルの行を取得するSQL文); $index = 0; foreach ($users as $row) { $users[$index]['items'] = (user_idに対応したitemsテーブルの行を取得するSQL文); $index++; } print_r($users); /* Array (  [0] => Array   (    [user_id] => aaaa    [items] => Array     (      [0] => Array       (        [user_id] => aaaa        [item_name] => アイテム1       )      [1] => Array       (        [user_id] => aaaa        [item_name] => アイテム2       )     )   )  [1] => Array   (    [user_id] => bbbb    [items] => Array     (      [0] => Array       (        [user_id] => bbbb        [item_name] => アイテム3       )     )   ) ) */ と、このように2段階に分けてやれば取得できるのですが、 そうではなくてこれを一度に取得できるSQL文というかやり方はあるのでしょうか? $users = (usersテーブルの行を取得するSQL文);←この段階でそれぞれ対応してるitemsテーブルの行まで取得したい

  • JOINを使ったSQL文を作成しようとしています。

    JOINを使ったSQL文を作成しようとしています。 以下の様な3つのテーブルがある場合のSQL文を教えて下さい ※勉強の為、適当なテーブルを作成しましたが、やりたい事は  JOINの中に更にJOINさせたSQL文を作成したいと思ってます 表A  USER_ID(プライマリキー)  NAME 表B  USER_ID(プライマリキー) ※表A.USER_IDと紐着く  BUMON(プライマリキー)  TERM(プライマリキー) 表C  BUMON(プライマリキー) ※表B.BUMONと紐着く  TERM(プライマリキー) ※表B.TERMと紐着く  MEMBER 【取得したい項目】  表A.USER_ID 【抽出条件】  表CのMEMBERの値が'10','20'以外(である表AのNAMEを取得)

  • mysqlのsql文について教えて下さい

    mysqlのsql文について教えて下さい 下記のようなテーブルとデータがあった場合に どうやれば 2,次郎だけを抽出できますか? 本日日付(2010-08-06)が 既にテーブルBにdateが存在する場合は 3,1,2010-08-04 3,1,2010-08-06を 対象外にしたいです。 Aテーブル id,user 1,太郎 2,次郎 3,3郎 Bテーブル targetid,homonid,date(datetime型) 3,1,2010-08-04 3,1,2010-08-06 3,2,2010-08-05 下記だと2010-08-04にヒットしてしまい(当たり前?)動作しません。 select distinct a.* from tblA a, tblB b where date_format(b.date, "%Y-%m-%d") <> "2010-08-06" ;

  • select文で特定のIDを抽出しupdate

    こんにちは、はじめまして。phpとmysqlで以下のような処理をしたいのですが どうすればよいか分からず、ご質問させていただきました。 前提として、下記のような「アイテム」、「ユーザー」、「画像」を管理する3つのtableが あり、「画像」テーブルでは、どのアイテムに(item_id)どのユーザーが(user_id)その 画像を投稿したかを管理するtableが存在します。 そこで、画像が投稿された際に、アイテムtableの、「item_image」のカラムに item_idと、user_idがマッチする【image_id】をupdateしたいのですが ※item_idと、user_idの値については保持しており、データがあります。  また、item_idと、user_idの組み合わせはユニークで、画像table内に1つしかありません。 image_idをどのように抽出すればいいか分からずご相談させていただきました。 ※ちなみに、item_id,user_id,image_idは、PRIMARY KEYです。 環境など補足が必要でしたらご連絡いただけますと幸いです。 どうかよろしくお願いいたします。 ■アイテムtable item_id |item_name | item_image・・・ ------------------------ 1    |aaa     |4 ■ユーザーtable user_id | user_name ------------------------ 3    | aaa ■画像table image_id | item_id | user_id ------------------------ 4     | 1 | 3

  • SQLがわかりません。。

    すみません、単純な質問かもしれませんが、どう組み立てたら良いのか悩んでいますので、SQL文について質問させてください。 以下の様な2つのテーブルがあります。 ○テーブル1 ----------------------------------- ID bangou1 bangou2 1 1 2 2 3 4 3 2 4 ○テーブル2 ----------------------------------- ID bangou flag 1 1 1 2 2 1 3 3 0 4 4 1 ●希望する取得結果 テーブル1のID:1,ID:3 bangou1、bangou2は、テーブル2のIDを設定しています。 このとき、テーブル2のflagに0が設定されている場合はbangou1、bangou2のどちらにあってもテーブル1のIDは取得したくありません。 このSQLを組み立てる方法がいまいち思いつきません。 どうかアイデアをお願いします。

  • 一度のsqlで値を取得するには

    mysql5です。 テーブル名pref(都道府県) id,name 1,北海道 2,青森県 3,秋田県 ・・・ テーブル名user(会員) id,pref_flg,addr01,addr02 1,1,市町村,それいかの住所 2,2,市町村,それいかの住所 3,3,市町村,それいかの住所 ・・・ 上記のようなテーブルであるとした場合userをselectしデータを取得します。 SELECT id, CONCAT(pref_flg, addr01, addr02) AS addr FROM user WHERE id = ? この結果addrには『1(※都道府県id)市町村それいかの住所』で取得できるのですが 一度のsqlで都道府県名も取得するにはどうすればできますか? 具体的には 『1(都道府県id)市町村それいかの住所』 を 『都道府県名市町村それいかの住所』 としてidではなく名称で取得したいです。 単純にuserに都道府県名を入れればできるのですが上記のように複数のテーブルで管理する場合の 方法を教えてください。

    • ベストアンサー
    • MySQL
  • SQL文のエラー

    SQL文でエラーが表示されます。どの部分を修正すればいいですか? SQL文が長いので文字列を結合する演算子「.」を使って複数行に分けています。 エラー内容:SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= ? and product_id = product.id' at line 2 //商品番号だけでなく、商品名や価格も表示したいので商品情報を保持するproductテーブルと 結合する。 //全て取得するのでSELECTは* //favoriteテーブルにはcustomer_idとproduct_id //productテーブルにはid, name, price $sql = 'SELECT * FROM favorite, product' . 'WHERE customer_id = ? and product_id = product.id '; // ?に顧客番号を指定する。 // favoriteテーブルの商品番号(product_id列)と、productテーブルの商品番号(id列)が // 一致している行だけが必要なので、WHERE句に条件を追加する。

  • SQL文を教えてください。

    特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16

  • SQL文詳しい方お願いします!

    VBであるツールを作成しております。 以下の2つのテーブルがあります。 そこで現在は、SELECT WRITE_D.ID           FROM CHECKS INNERJOIN WRITE_D ON HECKS.ID=WRITE_D.ID          WHERE 閲覧権限=0 をVBのデータグリッド上に表示すると同じIDの数分の行が出来てしまいます。 ■条件 VBのツールからAさんが書き込みを行うと(2)に新規ID(*1)で1行追加され (1)にはユーザー数分*1が作成されます。 そこで書き込みの確認を行うと(1)のテーブルから該当ユーザーのID行が削除されます。 その際に、未確認のテーブルのみをSELECTで取得を行いたいのですが 何か良い方法はありますでしょうか?ご教示下さい。 (1)CHECKSテーブル ID   LNAME 31   Aさん 32   Aさん 31   Bさん 32   Bさん 31   Cさん 32   Cさん       ・       ・       ・ (2)WRITE_Dテーブル ID   内容     閲覧権限 31   ×××      0 32   ▲▲▲    1        ・        ・        ・