dポイントプレゼントキャンペーン実施中!

下記のような場合の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発行数は少なくして)するにはどうすればいいのでしょうか?
よろしくお願いします

A 回答 (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`='ラーメン'

この回答への補足

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

補足日時:2006/02/21 22:59
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/22 12:15

#4です。



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

ちょっと間違えました。



select date from table where syouhin like '%タバコ%' or syouhin like '%ラーメン%'
ですね
    • good
    • 0

んーと、テーブルの作りがあまり良くないとは思いますが、


とりあえず、結果を出すのであれば
select date from table where syouhin like '%タバコ%' or '%ラーメン%' で出せると思います。

ですが、質問のようにsyouhinフィールドに商品名を
列挙するのであれば、データが増えるに連れて
結果が出るのが遅くなるはずなので、
私ならテーブルの設計を変えます。

この回答への補足

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

補足日時:2006/02/21 23:08
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/21 21:32

MySQLは触ったことがありませんが、、、



Select Distinct(date) From table
Where syouhin = 'タバコ' or syouhin = 'ラーメン' ;

でどうでしょうか?
商品がたくさんあるのなら、

Where syouhin in ('タバコ', 'ラーメン',・・・)

とすればよいのでは・・・。f^_^;

この回答への補足

やってみました
テーブルは
dateフィールドと
syouhinフィールドで
ともにKEYにしました
datesyouhin
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使いました)

補足日時:2006/02/21 22:40
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/02/21 21:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!