• ベストアンサー

SQLを教えてください

下記のような場合のSQLがわからなくて困っています ご回答よろしくお願いします 日単位に買い物リストを作っています 2月1日 タバコ 書籍  ラーメン 2月2日 本   ジュース 2月3日 タバコ ラーメン 2月4日 タバコ 条件1:商品は1万種類以上 条件2:1日の購入商品数は最大100 条件3:抽出条件も最大100 上記の場合でタバコとラーメンを買った日 (2月1日と2月3日)が知りたいのですが SQLが分かりません 思いついたのが | Field | Type | Key | +---------+------+------+ | date  | date | PRI | | syouhin| text |    | +---------+------+------+ このshouhinに商品名または商品IDを連続で書いて もってこれないかな?と思ったりしましたが むりそうですよね?・・・ 上記のテーブルで抽出結果を更に抽出・抽出・・・・ とすれば可能ですが、条件にも書いたとおり 抽出対象の商品が最大100になります このような条件で抽出(SQL発行数は少なくして)するにはどうすればいいのでしょうか? よろしくお願いします

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

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

普通はこうしませんか? kaimonoテーブル id date    syouhin 1 2006-02-01 タバコ 2 2006-02-01 書籍 3 2006-02-01 ラーメン 4 2006-02-02 本 5 2006-02-02 ジュース 6 2006-02-03 タバコ 7 2006-02-03 ラーメン 8 2006-02-04 タバコ ※idはauto_incrementで十分。 そこで、日付テーブルを用意してinner joinしていく という流れ。日付テーブルをあえて用意しないので あればtemporaryつかう手もあります。 sql文は長いですが、PHPなどプログラムで制御すれば 問い合わせは少ないのでスピードは速いとおもいます。 create temporary table `date_table` select distinct `date` from `kaimono`; select * from `date_table` inner join `kaimono` as `k1` on `date_table`.`date`=`k1`.`date` and `k1`.`syouhin`='タバコ' inner join `kaimono` as `k2` on `date_table`.`date`=`k2`.`date` and `k2`.`syouhin`='ラーメン'

jojo12345
質問者

お礼

まるまる写して実行してみました 2/1と2/3がきれいに抽出されていました ありがとうございます まさに、求めていた回答および結果でした inner join勉強します ありがとうございました

jojo12345
質問者

補足

いま、mysqlが使えないので明日テストしてみます 私の質問の仕方がわるかったのですが、 2006-02-04はHITさせたくありません タバコとラーメンを買った日(02-01と02-03だけ)HITさせたいです inner join勉強します

その他の回答 (4)

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

#4です。 大丈夫。 わたしの例では2/4のはヒットしないと思います。

  • Paul_xxx
  • ベストアンサー率56% (27/48)
回答No.3

ちょっと間違えました。 select date from table where syouhin like '%タバコ%' or syouhin like '%ラーメン%' ですね

  • Paul_xxx
  • ベストアンサー率56% (27/48)
回答No.2

んーと、テーブルの作りがあまり良くないとは思いますが、 とりあえず、結果を出すのであれば select date from table where syouhin like '%タバコ%' or '%ラーメン%' で出せると思います。 ですが、質問のようにsyouhinフィールドに商品名を 列挙するのであれば、データが増えるに連れて 結果が出るのが遅くなるはずなので、 私ならテーブルの設計を変えます。

jojo12345
質問者

お礼

ご回答ありがとうございます 早速ためします (ちょっと、風呂入ってきます・・・) ちなみに、テーブル設計はどのように変えるのでしょうか?

jojo12345
質問者

補足

accessで SELECT date FROM table WHERE syouhin Like "*タバコ*ラーメン*"; としてみました Paul_xxxさんのSQLと同じことですよね? なるほど・・・たしかにHITしますね ありがとうございました!

  • nov-d
  • ベストアンサー率36% (51/140)
回答No.1

MySQLは触ったことがありませんが、、、 Select Distinct(date) From table Where syouhin = 'タバコ' or syouhin = 'ラーメン' ; でどうでしょうか? 商品がたくさんあるのなら、 Where syouhin in ('タバコ', 'ラーメン',・・・) とすればよいのでは・・・。f^_^;

jojo12345
質問者

お礼

ご回答ありがとうございます 早速やってみます 結果は後ほど・・・

jojo12345
質問者

補足

やってみました テーブルは dateフィールドと syouhinフィールドで ともにKEYにしました date syouhin 02-01 タバコ 02-01 ラーメン 02-01 書籍 02-02 ジュース 02-02 本 02-03 タバコ 02-03 ラーメン 02-04 タバコ こんな感じです SELECT DISTINCT date FROM kaimono WHERE (syouhin="タバコ") OR (syouhin="ラーメン"); の結果は 02-01 02-03 02-04 でした・・・ 02-04はタバコだけなので、HITさせたくないのです もちょっと考えます (テストはaccess使いました)

関連するQ&A