顧客&商品+指定文字列を含む、最新のデータ取得

このQ&Aのポイント
  • 顧客&商品を指定の文字列と共に含む最新のデータを取得する方法を教えてください
  • MySQL5を使用して、顧客と商品名が指定の文字列を含む最新のデータを取得する方法について教えてください。
  • 顧客と商品名が指定の文字列を含む最新のデータを取得するためには、どのようなSQLクエリを使用すればよいのでしょうか?
回答を見る
  • ベストアンサー

顧客&商品+指定文字列を含む、最新のデータ取得

お世話になります。 前回立てたトピック(http://okwave.jp/qa/q8565634.html)でサンプルデータにミスがあったため、立て直しです。 ※顧客&商品ごとの本申込という文字列が含まれる最新データを取得したい ※商品名の長さは変動します(商品名には実際は番号はありません) ※MySQL5です。 どうぞお知恵をお貸しください。 ■テーブルデータ CREATE TABLE IF NOT EXISTS `TABLE1` ( `SEQ_ID` mediumint(8) NOT NULL AUTO_INCREMENT COMMENT 'シーケンスID', `TO_USER_NM` varchar(128) DEFAULT NULL COMMENT '顧客', `MAIL_TITLE` varchar(256) DEFAULT NULL COMMENT '商品', `SEND_TIME` datetime NOT NULL COMMENT '購入日時', PRIMARY KEY (`SEQ_ID`) ); INSERT INTO `TABLE1` (`SEQ_ID`, `TO_USER_NM`, `MAIL_TITLE`, `SEND_TIME`) VALUES (1 , '顧客A', '『商品1』仮申込', '2014-03-01 13:07:43'), (2 , '顧客C', '『商品1』仮申込 / 変更1', '2014-03-02 10:06:54'), (3 , '顧客E', '『商品1』仮申込', '2014-03-03 10:06:54'), (4 , '顧客E', '『商品1』本申込', '2014-03-04 13:33:51'), (5 , '顧客B', '『商品1』本申込', '2014-03-05 14:58:41'), (6 , '顧客A', '『商品1』本申込 / 変更1', '2014-03-06 16:42:56'), (7 , '顧客D', '『商品1』本申込 / 変更2', '2014-03-07 17:27:33'), (8 , '顧客C', '『商品1』本申込 / 変更1', '2014-03-08 13:56:29'), (9 , '顧客A', '『商品2』仮申込', '2014-03-09 18:44:05'), (10, '顧客A', '『商品2』仮申込 / 変更1', '2014-03-10 10:43:14'), (11, '顧客C', '『商品1』本申込 / 変更2', '2014-03-11 08:51:02'), (12, '顧客C', '『商品1』本申込 / 変更3', '2014-03-12 20:33:39'), (13, '顧客A', '『商品2』本申込', '2014-03-14 18:52:44'), (14, '顧客B', '『商品1』仮申込', '2014-03-15 16:13:47'), (15, '顧客B', '『商品1』本申込 / 変更3', '2014-03-16 21:07:35'), (16, '顧客B', '『商品1』本申込 / 変更4', '2014-03-18 21:07:34'), (17, '顧客B', '『商品3』仮申込', '2014-03-19 21:42:46'), (18, '顧客B', '『商品3』本申込', '2014-03-20 22:14:10'), (19, '顧客A', '『商品2』本申込 / 変更1', '2014-03-21 23:44:06'), (20, '顧客A', '『商品1』本申込 / 変更5', '2014-03-22 08:22:59'), (21, '顧客A', '『商品2』仮申込', '2014-04-01 13:07:43'), (22, '顧客A', '『商品2』本申込 / 変更2', '2014-04-02 10:06:54'), (23, '顧客B', '『商品2』仮申込', '2014-04-03 10:06:54'), (24, '顧客B', '『商品2』仮申込 / 変更1', '2014-04-04 13:33:51'), (25, '顧客B', '『商品2』本申込', '2014-04-05 14:58:41'), (26, '顧客F', '『商品1』仮申込', '2014-04-06 16:42:56'), (27, '顧客F', '『商品1』本申込', '2014-04-07 17:27:33'), (28, '顧客G', '『商品3』仮申込', '2014-04-08 13:56:29'), (29, '顧客F', '『商品1』本申込 / 変更1', '2014-04-09 18:44:05'), (30, '顧客G', '『商品3』本申込', '2014-04-10 10:43:14'), (31, '顧客A', '『商品1』本申込 / 変更6', '2014-04-11 08:51:02'), (32, '顧客A', '『商品2』本申込 / 変更3', '2014-04-12 20:33:39'), (33, '顧客F', '『商品1』本申込 / 変更2', '2014-04-14 18:52:44'), (34, '顧客C', '『商品3』仮申込', '2014-04-15 16:13:47'), (35, '顧客C', '『商品3』本申込', '2014-04-16 21:07:35'), (36, '顧客H', '『商品1』仮申込', '2014-04-18 21:07:34'), (37, '顧客H', '『商品1』本申込', '2014-04-19 21:42:46'), (38, '顧客H', '『商品1』本申込 / 変更1', '2014-04-20 22:14:10'), (39, '顧客E', '『商品2』仮申込', '2014-04-21 23:44:06'), (40, '顧客E', '『商品2』仮申込 / 変更1', '2014-04-22 08:22:59'); ■取得したいデータ 38, '顧客H', '『商品1』本申込 / 変更1', '2014-04-20 22:14:10' 35, '顧客C', '『商品3』本申込', '2014-04-16 21:07:35' 33, '顧客F', '『商品1』本申込 / 変更2', '2014-04-14 18:52:44' 32, '顧客A', '『商品2』本申込 / 変更3', '2014-04-12 20:33:39' 31, '顧客A', '『商品1』本申込 / 変更6', '2014-04-11 08:51:02' 30, '顧客G', '『商品3』本申込', '2014-04-10 10:43:14' 25, '顧客B', '『商品2』本申込', '2014-04-05 14:58:41' 18, '顧客B', '『商品3』本申込', '2014-03-20 22:14:10' 16, '顧客B', '『商品1』本申込 / 変更4' '2014-03-18 21:07:34' 12, '顧客C', '『商品1』本申込 / 変更3' '2014-03-12 20:33:39' 7 , '顧客D', '『商品1』本申込 / 変更2' '2014-03-07 17:27:33' 4 , '顧客E', '『商品1』本申込', '2014-03-04 13:33:51'

  • MySQL
  • 回答数4
  • ありがとう数6

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

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

>メール情報をさらにテーブルにして細分化したりしない方向で、そのまま取得できないか はっきりいえば、SQLでやる作業ではない しかしできる・できないという意味ではできるのでできるので一応書いておきます。 しかし、こんなことやってたらRDB上達しないですよ (インデックスは絶対効かないし効率最悪で、データが増えるとすぐいきづまる・・・) //例 select * from TABLE1 where ( TO_USER_NM ,substr(MAIL_TITLE,@pos:=instr(MAIL_TITLE,'『')+1,instr(MAIL_TITLE,'』')-@pos) ,SEND_TIME ) in ( select TO_USER_NM as 顧客 ,substr(MAIL_TITLE,@pos:=instr(MAIL_TITLE,'『')+1,instr(MAIL_TITLE,'』')-@pos) as 商品 ,max(SEND_TIME) from TABLE1 where substr(MAIL_TITLE,instr(MAIL_TITLE,'』')+1,3)='本申込' group by 顧客,商品 ) order by SEND_TIME desc ※ポイント substr(MAIL_TITLE,@pos:=instr(MAIL_TITLE,'『')+1,instr(MAIL_TITLE,'』')-@pos) というのが商品名です

sirowabi
質問者

お礼

何度も恐れ入ります。 お教えいただいたSQLで取得したかったデータを取得することが出来ました。 こちらのわがままにつきあってくださり本当にありがとうございます。 客先のシステムをヘタにいじらずに情報を取得出来てほっとしております。 ありがとうございました。

その他の回答 (3)

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

ちゃんとやるなら (1)顧客テーブル、商品テーブルを別途つくって正規化する (2)申込状況については正規化するかsetやenumで処理する (3)変更については仕様がわからないのでなんともいえない メモレベルならvarcharで持ってもいいし、標準化するなにかがあるなら それをもとに正規化してもよい としたうえで (4)それを前提に レコードのID,顧客ID,商品ID,申込状況,変更状況,購入日時 の項目を整備したテーブルをつくり集計する

sirowabi
質問者

補足

何度もご意見いただきありがとうございます。 顧客テーブル、商品テーブル等は存在するのですが、今回やりたいのは、メールでのやり取りを保存したテーブルからのメール情報自体の取得のため、なんとかメール情報をさらにテーブルにして細分化したりしない方向で、そのまま取得できないかとあがいているところです。 不可能であれば本申込だけでも絞れれば手動で出来ることではあるので、もし出来れば…と質問させていただいております。 このままもうしばらく質問は締め切らずにおきたいと思います。 いろいろありがとうございます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

やらかしてました。 X)where tbl2.MAIL_TITLE like '%本申込% ○)where tbl2.MAIL_TITLE like '%本申込%'

sirowabi
質問者

補足

確認しました、訂正ありがとうございます。

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

環境が無いので試験してません。 whereのワイルドカードが違うかも。 字下げで全角スペース使ってるので注意してください カッコの外のwhereに出てくる3列をカッコで囲むのがポイントのはず。 --先にカッコの中を実行してみてください。  select tbl2.TO_USER_NM, tbl2.MAIL_TITLE, max(SEND_TIME) max_SEND_TIME  from TABLE1 tbl2  where tbl2.MAIL_TITLE like '%本申込%  group by tbl2.TO_USER_NM, tbl2.MAIL_TITLE ; --ここまで がOKなら以下を実行 --以下、全文、 select tbl1.* from TABLE1 tbl1 where (tbl1.TO_USER_NM, tbl1.MAIL_TITLE, tbl1.SEND_TIME) in (  select tbl2.TO_USER_NM, tbl2.MAIL_TITLE, max(SEND_TIME) max_SEND_TIME  from TABLE1 tbl2  where tbl2.MAIL_TITLE like '%本申込%  group by tbl2.TO_USER_NM, tbl2.MAIL_TITLE ) ;

sirowabi
質問者

補足

回答ありがとうございます。 試してみたのですが、本申込を含むレコードが全て出てきてしまいました。 カッコ内、全文のどちらのSQLでも同じ(並び順だけ違う)でした。 また、こちらの質問の書き方が悪かったせいだと思いますが、商品(MAIL_TITLE)カラムで同じ商品として扱いたいのは『』内の名称のみです。 商品カラム全体ではありません。 前回のSQLで使用していた商品名取得用のSQL部分は、 substr( MAIL_TITLE, 1, instr( MAIL_TITLE, '』' ) -1 ) です。 回答のお役に立てればいいのですが。。。 もう少し悩んでみます。

関連する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
  • MySQLで顧客毎に最新のデータ順で表示

    以下のようなデータがあります。 id 顧客コード 日付 金額 1 A001 2012/12/25 100 2 B001 2012/12/24 200 3 A001 2012/12/24 100 4 C001 2012/12/23 500 5 A001 2012/12/23 300 6 B001 2012/12/23 100 このデータを、顧客毎に最新順で表示したいのです。 順番は、 1.最新の日付順に顧客がまず並ぶ 2.その顧客の並び順で、顧客毎に日付が新しい順に各データが並ぶ 説明が下手ですが、下の様に 1 A001 2012/12/25 100 3 A001 2012/12/24 100 5 A001 2012/12/23 300 2 B001 2012/12/24 200 6 B001 2012/12/23 100 4 C001 2012/12/23 500 A001、B001、C001の中で、最新の日付を持っているのがA001→B001→C001なので、その順で並ぶ。 (SELECT 顧客コード, MAX(日付) FROM tbl GROUP BY 顧客コード かな?) さらに、その顧客の中で日付順にデータが並ぶ。 このように抽出するには、どのようなSQL文で行うのでしょうか。 サブクエリを使うのかなとは思うのですが、あまり理解できていないため思いつきません。 わかるかたよろしくお願いします。

    • ベストアンサー
    • MySQL
  • -excel-違うブックの文字列を含む行の抽出

    商品の価格を一括で変更できる方法を探しているのですが見つからず困っています。 全ての商品データが載ってるブックAがあります。価格を変更する商品のIDと値下げ後の値段が載っているブックBがあります。ブックAの商品価格をブックBの値下げ後価格に変更したいのですが、関数か、マクロなど何か良い方法はないでしょうか? 最悪価格は手動で変更するとしてせめてブックBのIDと合致するセルを持つブックAの行を抽出する方法はないでしょうか?抽出した行は別ブックにまとめてくれるとなお助かります。 ちなみにブックAには7000行、ブックBには1000行のデータがあります。 ブックA(商品データ) A列・・・・・・    F列・・・・・・・・ ID         価格 1234        2500 2345        3200 3456        1200 4567        3000 5678        1800 ブックB(価格変更データ) A列        B列 ID         価格 2345        2600 5678        1500 ↓ ブックA(商品データ)もしくは新規ブックC A列・・・・・・    F列・・・・・・・・ ID          価格 1234        2500 2345        2600 3456        1200 4567        3000 5678        1500 といった感じです。どなたかお知恵をお貸しください。よろしくお願いいたします。

  • LAG関数に似た関数があればご教示ください。

    いろいろ試行錯誤したのですが、ご質問させて頂きたいと思います。 以下のようなテーブルがあったとします。トランザクション形式です。 すべてのデータは数値型です。 ID seq time A 1 10 A 2 5 B 1 25 B 2 30 C 3 20 C 3 10 C 3 20 以下のようにしたいと思います。 同一IDの中で一つ前の行のTimeをみて差分を出したいと思います。 以下のテーブルをみますと、IDがAのSEQ2番のtimeは5、 IDがAのSEQ1番のtimeは10です。なので5から10を引くと-5となります。 それをtime_diffにいれたいと思います。 ID seq time time_diff A 1 10 null A 2 5 -5 B 1 25 null B 2 30 5 C 3 20 null C 3 10 -10 C 3 20 -10 OracleではLAG関数があり、一つ前の行を参照することができ、今までそうしてましたが、SQL2005には同じような関数を探してもありませんでした。 仕方ないのでテーブルを別名保存し、timeフィールドをtime_lagと変更、そのテーブルに1行空行を追加し、オリジナルと結合させて time同士を引き算してました。 しかし、この場合、あまりに負荷がかかり、ディスク領域も取ることから何か別の方法があればどうかご教示ください。

  • EXL指定した文字列リストと同一を指定セルに表示

    下記のようなエクセルデータになっています。 表示の関数についてご教授願いますようお願いいたします。 上部の検索条件です(50行くらいあります) A列   B列   C列   D列   E列   F列 a     a     a     b     c 1     1    1     3     1 下部のフィールドです(数百行あります A列   B列   C列   D列   E列   F列 a     a     a     b     c 1     1    1     3     1 2     2    2     E     2 表示したい条件 A列   B列   C列   D列   E列   F列 a     a     a     b     c 1     1    1     3     1 2     2    2     E     2 F列のセルにD列と同じ文字列がある場合、文字列又は”○”で 表示出来たらと思います。 よろしくご教授のほどお願いいたします。

  • 多次元配列のキーをつないで文字列にする

    PHP5.4の配列で仮に次のようなものがあったとします。 <?php $arr['A']['B']['C']['D'] = null; $arr['A']['B']['D']['C'] = null; $arr['A']['B']['D'] = null; それぞれのキー名をつなぎあわせてそれぞれ「A, B, C, D」「A, B, D, C」「A, B, D」といった文字列に変換したいのですが、どのようにしたら実現できるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • Access [SQL]月別ので最新日付取得方法

    お世話になります。 Accessで顧客管理をしています。 【出力条件】 (1) 顧客IDごとに1月1レコード (2) 同月内に顧客IDが2レコード以上ある場合は最新の購入日 (3) (2)が2レコード(同月内最新の購入日が2レコードある場合は、連番が多い方) 言葉でうまく説明できないのですが・・・ 月 購入日 顧客ID  連番 -------------------------- 04 2010/04/01 a-136 001 04 2010/04/09 a-136 001 04 2010/04/09 a-136 002 04 2010/04/10 b-991 001 04 2010/04/11 b-991 001 04 2010/04/11 b-991 002 04 2010/04/12 b-991 001 04 2010/04/13 b-991 001 05 2010/05/05 a-136 001 05 2010/05/13 e-991 001 05 2010/05/13 e-991 002 05 2010/05/30 s-333 001 このような表の場合、出力結果を 月 購入日 顧客ID ----------------------- 04 2010/04/09 a-136 002 04 2010/04/13 b-991 001 05 2010/05/05 a-136 001 05 2010/05/13 e-991 002 05 2010/05/30 s-333 001 のように出すクエリー(SQL文)を教えて頂けますでしょうか? もし、クエリーが無理ならVBAでもよいのでどなたかご教示お願い致します。

  • データ中の文字列置換方法

    以下の様なデータがあり項目Aが’B01’の場合は★として置換し、’B01’以外はNULL値として置換するSQL(ORACLE)について教示お願い致します。 <データの内容> 項目A A00 A01 B01 C01 B01 D01 <出力結果>      ←NULL      ←NULL ★      ←NULL ★      ←NULL

  • エクセルで指定した月と指定した顧客の合計を出す方法はありますか?

    エクセルで指定した月と指定した顧客の合計を出す方法はありますか? なかなか答えが見つからず困っています。 1 200904 顧客A \2300 2 200904 顧客A \5000 3 200904 顧客B \5000 4 200904 顧客C \2400 5 200904 顧客C \2600 6 201004 顧客A \2700 200904 顧客A の合計 201004 顧客A の合計  200904 顧客B の合計 200904 顧客C の合計 の様に年月でかつ顧客ごとの合計がでるような 関数があるのでしょうか?

  • excelで指定文字間の繰り返し抽出の方法

    excelの文字列でる特定の文字と文字(この場合、カンマ「,」)の間に存在する 文字だけを抽出する方法が分かりません。 シートAとシートBが存在します。 シートA セルA セルB 売上番号 商品名 0001 A,B,C,D,E 0002 A,B,E 0003 AAA 0004 ブランク=(NULL) 0005 xyz  : シートB セルA セルB 商品番号 商品名 0001 A 0002 B 0003 C 0004 AAA 0005 E 0006 BBB 0007 D  : そこで、シートAのセルBにある商品名が、シートBのセルBの商品名に 存在するかを検索し、すべて存在したらシートAの該当する行のセルC に、”〇”か”×”を設定したい。 関数での方法があればどなたか教えてください。 関数が無理でしたら、マクロ、vbaなどで教えてください。 よろしくお願いします。