• ベストアンサー

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

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

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

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

  • 期間限定の抽出 SQL 文を教えてください。

    MySQL を phpMyAdmin にて使用しています。 次のような項目があります。 bunrui varchar(5) kaisaibi date ここから下記の条件にてデータを抽出したいのですが、うまくいきません。条件を満たす SQL 文の書き方を教えてください。 条件1 kaisaibi が 2003年5月1日から2003年5月31日までの間で 条件2 bunrui が 04-01 または 06-01 であるもの。 SELECT * FROM `check_hiben` WHERE kaisaibi >= '20030501' AND kaisaibi <= '20030531' AND bunrui = '04-01' OR bunrui = '06-01' ORDER BY kaisaibi LIMIT 0 , 1000 上記の SQL 文を実行したところ、2003年5月以外のデータまで抽出されてしまいました。困っております。どなたかお助けください。よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLで日付

    MySQLです。JAVAです。 下記に該当するレコード項目全てを抽出するには、 どのようなSQLを書けばよいでしょうか? 指定日 sitei_date = 2015-07-14 sampleテーブル -------------------- ID name date -------------------- 1 商品A 2015-07-07 1 商品A 2015-07-13 1 商品A 2015-07-14 ・・・ これを抽出したい 1 商品A 2015-09-11 2 商品B 2015-09-10 2 商品B 2015-07-15 2 商品B 2015-07-13 3 商品C 2015-07-07 3 商品C 2015-07-11

    • ベストアンサー
    • MySQL
  • SQLでの複数検索条件の書き方を教えて下さい。

    SQLを使うことが初めての、本当にど素人です。 質問の仕方自体おかしいかもしれませんが、どなたか下記条件でデータ抽出するSQLの書き方を教えて下さい。 【抽出条件】 1つの商品購入テーブルから、5月と6月に購入してて、7月と8月に購入していない、東京都と神奈川県在住の方の顧客IDと購入商品すべてを抽出できないでしょうか? カラムは、顧客ID、購入月、顧客都道府県、商品コードとそれぞれ分かれています。 この内容で、ご回答いただけますでしょうか? 何卒よろしくお願いします。

  • SQLでレコードの抽出

    MySQLです。 商品IDと販売先、管理番号が、判明しているとき、 最大商品IDとそのレコードを取得するには、 どのようなSQLを書けば、よろしいでしょうか? select *, ? from SYOUHIN WHERE ???? テーブル例) ↓ユニーク 商品ID 販売先 管理番号  販売日 1   A社   1     2015-07-10 2   A社   2     2015-07-12 3   B社   1     2015-06-30 4   B社   2     2015-07-06 5   C社   1     2015-04-21

    • ベストアンサー
    • MySQL
  • 1つのSQLで2段階の抽出を行いたい

    恐らくそれほど複雑なSQLではないと思いますが、中々SQLが作成できず困っています。 回答いただければ嬉しいです。 以下のテーブルがあったと仮定します。 テーブル名:  売上げ明細 カラム:  ・商品ID … 売上げ明細なので一意ではありません  ・単価 … 同じ商品IDでも、レコードによって単価は異なります  ・数量 … 1~5の整数のみとします 実際のデータは以下の通りです。 商品ID,単価,数量 1001,50,2 1001,60,5 1002,90,3 1003,60,5 1003,80,4 1003,90,1 1004,60,3 上記データを以下の通り抽出するには、どのようなSQLを組めばいいでしょうか? 1.まず各商品IDの中から単価が最大のレコードだけを取り出す 商品ID,単価,数量 1001,60,5 1002,90,3 1003,90,1 1004,60,3 2.次に数量でgroup by して、件数をカウントする 数量,件数 1,1 3,2 5,1 1つのSQL文で2の結果が得られれば、途中の抽出条件は特に問いません。 ちなみにMySQL5を使っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数のフィールドからデータをまとめるには?

    mysql5.0.18です 日単位に買い物リストを作っています テーブル名「kaimono」 フィールドは下記の通り 「date」 「data1」 「data2」 「data3」 データはこんな感じです 2月1日 タバコ 書籍  ラーメン 2月2日 本   ジュース 2月3日 タバコ ラーメン さて、これを 2月1日 タバコ 2月1日 書籍 2月1日 ラーメン 2月2日 本 2月2日 ジュース 2月3日 タバコ 2月3日 ラーメン と表示させたいのですが、可能でしょうか? 余分なフィードを表示しても問題ありません ようするに、data1,2,3をばらけて表示させたいのです よろしくお願いします

    • ベストアンサー
    • MySQL
  • 売り上げ集計SQLが作れません

    1つのTABLEに、1日の売上げ高を商品ごとに登録していくDBがあります。 簡単な構造は以下のとおりです。 日付       |A品売上額  |B品売上額 | 2008/11/01 |500000    |600000   | 2008/11/02 |450000    |800000   | 2008/11/03 |100000    |700000   | ・・・ 2008/11/30 |200000    |500000   | 2008/12/01 |300000    |100000   | <質問> それぞれの商品の1ヶ月売上高をSQLで抽出したいと思うのですが、Group byで何を指定したらいけるのかわからず困っています。 SQLで計算せずに抽出だけ行って、CGI側で計算するしかないのでしょうか? アドバイスお願いいたします。 <最初に考えたSQL(Group byがないためエラーになりました)> select sum(a),sum(b) from uriage where date between '2008/11/01' AND '2008/11/30';

  • 単一SQL文にて抽出可能でしょうか?

    単一SQL文にて抽出可能でしょうか? Ver8.3系 予めサブクエリーにて任意の条件にて抽出した店データのIDの値を基に、 商品データを抽出するのですが、その商品は、お店毎にランダムに1件抽出される。 <抽出例> 例えば、サブクエリーにて5店舗対象となり、そのお店紐付けられる商品は お店毎にランダムに1商品しか抽出されない。 店ID、商品ID 000001、100001 000002、305001 010000、200010 011111、300001 020000、150000 色々試しているのですが、うまくいきません。 お詳しい方、ご教授願えないでしょうか? よろしくお願いします。

  • SQLについて何ですが

    一つのSQLで下記の様な検索が出来ないかと考えています、 大分類に分けて大分類の中で売れている商品のTOP10を表示し、 現在表示されている商品を抜いた売れている商品TOP100もに表示できるようとしています、 分類のテーブル・商品がどの分類に当てはまるのか関連づけし注文数も保持しているテーブル・商品の売れ行きを保持しているテーブルがあり 分類テーブルには15個(将来的に増える可能性ある)の分類ワードが入っていて、分類別に売れているTOP10を表示し重複部分もあるので最大150個の商品が表示されるようになっています、 全商品の売れ行きTop「表示されている商品プラス100件」を割り出しその中から表示商品はずしてみようと思いこの様なSQL文と作ったのですが今一うまくいっていないような気がします、 「select 商品名 注文数 from 商品テーブル    where 商品名 not in( select 商品名 from 分類商品テーブル where 分類 in ( select 分類 from 分類テーブル )    order by 注文数 desc limit 10) order by 注文数 desc limit 表示商品数+100」 どうもうまく表示できていない様な気がしているのですが、 このSQLどうなのでしょうか? ほかにもっといいSQL文があれば教えてください。 」

  • ACCESS 抽出条件教えてください。

    accessで商品の売り上げ管理をしようとしています。 例えば、日足テーブルがあって、日付と売数フィールドがあるとします。 ----------------------------- 日付      売数 … 2005/11/01  12 2005/11/02  10 2005/11/03  13 … … 2005/12/01  21 2005/12/02  22 2005/12/03  25 … ----------------------------- とあったとします。 このとき、月別に最大売数を出したい時、抽出条件はどのようにすればよいのでしょうか? 売数フィールドの抽出条件を DMax("売数","日足")とし、 日付フィールドの抽出条件(11月の最大売数を出したい)を Between #2005/11/01# And #2005/11/30# としても上手く行きません。 最終的に、 日付   売数 … 2005/01 20 2005/02 10 2005/03 15 2005/04 25 … といったように、月ごとに売数を抽出したい場合どのような抽出条件を使えばよろしいでしょうか? どうぞご教授願います。