- ベストアンサー
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発行数は少なくして)するにはどうすればいいのでしょうか? よろしくお願いします
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
普通はこうしませんか? 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`='ラーメン'
その他の回答 (4)
- yambejp
- ベストアンサー率51% (3827/7415)
#4です。 大丈夫。 わたしの例では2/4のはヒットしないと思います。
- Paul_xxx
- ベストアンサー率56% (27/48)
ちょっと間違えました。 select date from table where syouhin like '%タバコ%' or syouhin like '%ラーメン%' ですね
- Paul_xxx
- ベストアンサー率56% (27/48)
んーと、テーブルの作りがあまり良くないとは思いますが、 とりあえず、結果を出すのであれば select date from table where syouhin like '%タバコ%' or '%ラーメン%' で出せると思います。 ですが、質問のようにsyouhinフィールドに商品名を 列挙するのであれば、データが増えるに連れて 結果が出るのが遅くなるはずなので、 私ならテーブルの設計を変えます。
お礼
ご回答ありがとうございます 早速ためします (ちょっと、風呂入ってきます・・・) ちなみに、テーブル設計はどのように変えるのでしょうか?
補足
accessで SELECT date FROM table WHERE syouhin Like "*タバコ*ラーメン*"; としてみました Paul_xxxさんのSQLと同じことですよね? なるほど・・・たしかにHITしますね ありがとうございました!
- nov-d
- ベストアンサー率36% (51/140)
MySQLは触ったことがありませんが、、、 Select Distinct(date) From table Where syouhin = 'タバコ' or syouhin = 'ラーメン' ; でどうでしょうか? 商品がたくさんあるのなら、 Where syouhin in ('タバコ', 'ラーメン',・・・) とすればよいのでは・・・。f^_^;
お礼
ご回答ありがとうございます 早速やってみます 結果は後ほど・・・
補足
やってみました テーブルは 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使いました)
お礼
まるまる写して実行してみました 2/1と2/3がきれいに抽出されていました ありがとうございます まさに、求めていた回答および結果でした inner join勉強します ありがとうございました
補足
いま、mysqlが使えないので明日テストしてみます 私の質問の仕方がわるかったのですが、 2006-02-04はHITさせたくありません タバコとラーメンを買った日(02-01と02-03だけ)HITさせたいです inner join勉強します