- ベストアンサー
商品とユーザーのマッチングSQL文作成
yambejpの回答
#2です ちなみにこんな感じ? //元データ create table item_genre(item_id int, genre_id int); insert into item_genre values(1,1),(1,2),(1,3),(2,1),(2,3),(2,4),(2,6); create table user_genre(user_id int,genre_id int); insert into user_genre values(1,1),(1,3),(2,1),(2,3),(2,4),(3,1),(3,3),(3,4),(3,5),(4,1),(4,4),(5,5); //結果 select user_id,item_id from user_genre as ug inner join item_genre as ig on ug.genre_id=ig.genre_id group by user_id,item_id having (user_id,count(*)) in (select user_id,count(*) from user_genre group by user_id); user4(user_id=4)は希望ジャンルが2個、item1(item_id=1)はジャンルが3個なので ジャンル数だけで考えればuser4はitem1に含まれますが、item1はgenre_id=4を 含まないので対象外、item2はジャンル1も4も持つため対象 user5(user_id=4)はgenre_id=5しか持たず、itemリストにgenre_id=5を持つ要素がないため 対象外
関連する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テーブルの行まで取得したい
- 締切済み
- MySQL
- 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を取得)
- ベストアンサー
- Oracle
- 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" ;
- 締切済み
- MySQL
- 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
- 締切済み
- MySQL
- 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を組み立てる方法がいまいち思いつきません。 どうかアイデアをお願いします。
- 締切済み
- Oracle
- 一度の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句に条件を追加する。
- 締切済み
- MySQL
- 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 ・ ・ ・
- ベストアンサー
- その他(データベース)
お礼
バッチリです。目から鱗でした。 難しくて理解するのに時間が掛かりましたが、以下の認識で合ってますでしょうか? select user_id,item_id from user_genre as ug inner join item_genre as ig on ug.genre_id=ig.genre_id で余計なジャンルを持つものを省き、 group by user_id,item_id having (user_id,count(*)) でユーザーと商品に共通するジャンルの数をカウント、 in ( select user_id,count(*) from user_genre group by user_id); でユーザーごとの全ジャンル数をカウントして ユーザーが持つジャンル全てが含まれているもののみ抽出 ありがとうございました!後ほどベストアンサー付けさせていただきます。