• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:顧客&商品+指定文字列を含む、最新のデータ取得)

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

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

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

  • ベストアンサー
  • 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