• 締切済み

商品Aと商品Bを購入したユーザーの取得

こんにちは! 現在以下の状態でのsql作成に悩んでいます。 テーブルユーザー uid name 1 test1 2 test2 3 test3 購入履歴 id uid item 1 1 商品A 2 1 商品B 3 2 商品B 4 3 商品A 5 3 商品C の様なテーブルから商品Aと商品Bを購入した ユーザーのみを抽出したいと考えています。 恥ずかしながら見当も付かない状態です。 ポインタだけでも結構ですので ご教示頂けますようよろしくお願いいたします。

  • MySQL
  • 回答数3
  • ありがとう数3

みんなの回答

回答No.3

#2です。 ごめんなさい。結合条件が抜けてました。 SQLを訂正します。 SELECT テーブルユーザー.uid, テーブルユーザー.name FROM テーブルユーザー, 購入履歴 AS Hist_A, 購入履歴 AS Hist_B WHERE テーブルユーザー.uid = Hist_A.uid AND テーブルユーザー.uid = Hist_B.uid AND Hist_A.item = '商品A' AND Hist_B.item = '商品B';

damemon
質問者

お礼

回答ありがとうございます。 投稿した後自分なりにも考えてみたのですが SELECT UID FROM 購入履歴 WHERE 商品名 in ('商品A', '商品B') having count(*) = 2 と言うのを考えてみましたが この方法ですと、商品Aを2度購入したユーザーも 拾えてしまい、要件を満たしませんでした 確かに、今回回答いただいた方法で 商品A、商品B等限定的であれば 一番有効そうではありますが マッチさせたい商品が多くなると検索に 時間がかかりそうでもあります。 とは言え、今回取得したい内容には 十分すぎる回答で、参考になります。 大変ありがとうございます。

回答No.2

こんばんは。 テーブル別名を使って、SQL上「購入履歴」テーブルを2つ用意し、 一方で"商品A"を持つレコードを、もう一方で"商品B"を持つレコードを検索すれば 目的の結果を抽出できると思います。 【例】 SELECT DISTINCT テーブルユーザー.uid, テーブルユーザー.name FROM テーブルユーザー, 購入履歴 AS Hist_A, 購入履歴 AS Hist_B WHERE Hist_A.item = '商品A' AND Hist_B.item = '商品B';

回答No.1

試していませんが、 SELECT DISTINCT ユーザ.id,ユーザ.name FROM ユーザ LEFT JOIN ON (ユーザ.id = 購入履歴.uid) WHERE 購入履歴.item = '商品A' OR 購入履歴.item = '商品B'; でしょうか?

damemon
質問者

補足

申し訳ありません。説明不足でした。 商品Aと商品B両方を購入しているユーザーのIDを 取得したいのでORではなくANDで検索したいのですが、、 何卒、よろしくお願いいたします。

関連するQ&A

  • 顧客と商品ごとに購入日時が最新のデータを取得したい

    お世話になります。 以下のテーブル1からサンプル1のようなデータを抽出したいのですが、SQLはどのように書いたらよいでしょうか。 ・顧客と商品ごとに購入日時が最新のデータを取得 ・商品は左側の番号が同じ場合は購入日が最新のデータのみ抽出したい データベースは MySQL5 です。 よろしくお願いいたします。 ●テーブル1 顧客  商品  購入日時 ---------------------------------  A  2-2  2014-04-23 08-00-00  A  2-1  2014-04-21 08-00-00  B  2-3  2014-04-20 09-00-00  B  2-2  2014-04-18 06-00-00  B  2-1  2014-04-15 05-00-00  A  1-3  2014-04-12 08-00-00  A  1-2  2014-04-10 04-00-00  C  2-2  2014-04-09 05-00-00  C  2-1  2014-04-08 06-00-00  C  1-2  2014-04-07 08-00-00  C  1-1  2014-04-06 05-00-00  A  1-1  2014-04-05 02-00-00  B  1-2  2014-04-04 02-00-00  B  1-1  2014-04-03 01-00-00 ●サンプル1 顧客  商品  購入日時 ---------------------------------  A  2-2  2014-04-23 08-00-00  B  2-3  2014-04-20 09-00-00  A  1-3  2014-04-12 08-00-00  C  2-2  2014-04-09 05-00-00  C  1-2  2014-04-07 08-00-00  B  1-2  2014-04-04 02-00-00

    • ベストアンサー
    • MySQL
  • SELECTで商品AとBを購入した得意先の抽出方法

    以下のようなテーブルがある場合に、SELECT文で商品Aと商品Bを両方購入している得意先のレコードを抽出することは可能でしょうか?得意先や商品は以下に限らず複数登録されています。 いい方法がありましたら教えてください。よろしくお願いします。 URIAGE_TBL 得意先  商品 数量 --------------------- 会社1   A   1   <- 抽出 会社1   B   2   <- 抽出 会社1   C   1   <- 抽出 会社2   D   1 会社3   A   2   <- 抽出 会社3   B   1   <- 抽出 会社4   A   2 会社4   C   2

  • MySQL複数テーブルからの情報取得に関しまして

    Aテーブル...ユーザ情報 Bテーブル...商品情報(AテーブルのユーザIDを列として持っています) Cテーブル...アイテム情報(Bテーブルの商品IDを列として持っています) Bテーブルの一覧リスト表示の画面にて、検索項目として、 Aテーブルのユーザ名、Cテーブルのアイテム名があります。 現在は、LEFT JOINを使って、検索、呼び出しを行っておりますが、 多数のカラムを指定して呼び出しを行っているため、SQL文が長くなってしまっており、 もっとすっきりとしたSQL文を記述したいと考えております。 ※Aテーブル,Bテーブルの組み合わせは他の画面でもよく使われております。 viewという機能を使うことによって、これをすっきりと記述できるようになるのではないかと考えておりますが、viewはこのような使い方をしてもいいのでしょうか。 または、もっとすっきりとした記述を行う技術のアドバイスをお願いいたします。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 行と列の入れ替え検索(行は可変で項目を固定にしたい)のSQL文が出来な

    行と列の入れ替え検索(行は可変で項目を固定にしたい)のSQL文が出来ない 以下のテーブルがあります。 <テーブルA> UID  name --------------- 1   伊藤 2   鈴木 3   高橋 4   佐藤 <テーブルB> no UID key   value ------------------- 1  1  telno  001-01-0001 2  1  faxno  001-01-0002 3  1  nickname itochan 4  2  telno  111-11-1111 5  2  faxno  111-11-1112 6  3  nickname hashi この2つのテーブルがあります。 ・テーブルAにあるUIDはテーブルBにない場合もあります。 この場合、以下のように出力して、csvファイルにしたいのですが、可能でしょうか? 申し訳ありませんが、よろしくアドバイスお願いいたします。 UID  name  telno    faxno     nickname ------------------------------------------------- 1   伊藤  001-01-0001 001-01-0002  itochan 2   鈴木  111-11-1111 111-11-1112 3   高橋                  hashi 4   佐藤 (経緯:wordpressのユーザの一覧(users,usetmetaテーブル)をユーザ一覧としてCSV形式にして保管したいのです。抽出&登録できるプラグインがなかったので)

    • ベストアンサー
    • MySQL
  • 異なるテーブル間の和

    テーブルAの属性item1とテーブルBのitem1の和を求めるにはSQLでどのように記述すれば良いのでしょうか?? tableA ------ id item1 item2 pointer tableB ------ id item1 item2 pointer という2つのテーブルで,tableBのpointerはtableAのidを指しています.

  • 一度に関連する他のテーブルの行も取得したい

    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 4.0xを利用してDBを構築しています。 しかしながら、サブクエリが使えないため以下のようなクエリが実現できず困っております。 EX: select mg.*,sumlg.* from mg left join (select id,uid from lg where uid = '00001') as sumlg on mg.id = sumlg.id where sumlg.id is null; 上記SQLは特定のユーザーIDの、テーブルBに存在しないテーブルAのIDをユーザー単位で切り分け抽出するSQL文です。 (テーブルBにはIDとUIDでユニークになるレコードが格納されています。) 上記を実現するためのSQLをどなたかアドバイスください。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLで日付

    MySQLです。JAVAです。 下記に該当するレコード項目全てを抽出するには、 どのようなSQLを書けばよいでしょうか? 指定日 sitei_date = 2015-07-14 sampleテーブル -------------------- ID name date -------------------- 1 商品A 2015-07-07 1 商品A 2015-07-13 1 商品A 2015-07-14 ・・・ これを抽出したい 1 商品A 2015-09-11 2 商品B 2015-09-10 2 商品B 2015-07-15 2 商品B 2015-07-13 3 商品C 2015-07-07 3 商品C 2015-07-11

    • ベストアンサー
    • MySQL
  • SQL Server 縦データを横データに

    お世話になります。 下記のテーブルから下記の条件で データを出力するSQL文を作成したいのです。 アドバイスお願い致します。 条件1:NAMEはAを抽出 条件2:ICHIはグループ集計 条件3:ITEMはD2とD3を抽出 TESTテーブル NAME ICHI ITEM DATA ----- ---- ---- ---- A A1 D1 1 A A1 D2 2 A A1 D3 3 A A1 D4 4 A A2 D1 10 A A2 D2 20 A A2 D3 30 A A2 D4 40 B A3 D1 100 B A3 D2 200 B A3 D3 300 B A3 D4 400 データ出力結果 NAME ICHI DATA DATA ----- ---- ---- ---- A A1 2 3 A A2 20 30

  • テーブルの列名をデータとして設定しておき取得する

    テーブルが2つあるとします。 テーブルAにはテーブルBの列名がデータとして登録されてます。 テーブルBには値が格納されてます。 テーブルA Key  field1  field2  field3 ------------------------------ 1   item2  item3  item5 2   item1  item2  item5 ------------------------------ テーブルB Key  item1  item2  item3  item4  item5 -------------------------------------------- 1    101   205    350   420   510 2    111   112    113   114   115 -------------------------------------------- ここでテーブルAとテーブルBへキーを指定して、 テーブルAのfield1~field3に登録されたすべての列名を元にテーブルBから値を取得したいです。 例として キー1を指定して取得すると 205,350,510 が取れます (item2,item3,item5の列名をテーブルAで指定した為) キー2を指定して取得すると 111,112,115 が取れます キーをパラメータとして与え、 できれば2つのテーブルを結合し、1回のSQLで取得する方法はありますでしょうか? (1回のSQLでなくても簡易であれば良いですが) よろしくお願い致します。