重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんにちは
連絡をOKの曜日を1、NGを0として0,0,0,0,0,0,0~1,1,1,1,1,1,1
の間の文字列を格納し、WHEREで利用しようと思っていたのですが
これはもしや微妙なのでは…と思ってちょっと相談に参りました

最初に考えていたのが、データ抽出を行う日の曜日をdate("w",time());
で取得し、値に対応するn番目のデータが1の場合のみHITという感じで
日,月,火,水,木,金,土の順番にデータを保持させています
(カンマ区切りでtext型になっています)

※連絡をしても良い曜日は複数でも可で、たとえば 月水金なら
0,1,0,1,0,1,0,0というデータになります

でも良く考えたら、このデータは抽出後にexplodeしないと比較データ
としては利用出来ない?と気づいて、SQL文の実行段階でデータを利用
する、いい方法は無いのかなーと思って調べてはいるのですが、どうも
良い検索キーワードが思いつかず足踏み状態です。。。

やりたいことは、月~日の曜日の間で連絡をしても良い曜日を判別して
検索した日の曜日と一致する場合に抽出を行うということです

質問内容をまとめますと
1.データ保持の方法が妥当なのかどうか
2.妥当な場合、比較の処理はSQLで出来るのか PHPで行うのか
3.SQLで出来る場合、関数のヒント

処理イメージをうまく説明出来ず伝わりにくい質問かと思いますので
補足が必要でしたらガンガン要求お願いします
構成や型の変更も何でもOKなので、こういう方法が応用きくよ、など
考え方のアドバイスも頂けると幸いです

MySQL クライアントのバージョン: 5.0.45/PHP Version 5.2.6 です。

A 回答 (3件)

>正規化



たとえば、こんなテーブルを用意するわけです。

ユーザー 曜日
田中さん 月曜
田中さん 火曜
田中さん 水曜
鈴木さん 月曜
鈴木さん 水曜
鈴木さん 金曜
木村さん 火曜
木村さん 水曜
木村さん 金曜

みたいな持ち方です。(実際にはidで管理するのが一般的かな)
この場合WHERE 曜日=月曜で検索すれば田中さん、鈴木さんが
ヒットしますね。これが一番SQL的なやりかたです。

>それぞれにフィールドを用意

この場合こんな感じ
ユーザー 月曜 火曜 水曜 木曜 金曜 土曜 日曜
田中さん 1  1  1
鈴木さん 1     1     1
木村さん    1  1     1
(ごめんなさい、ブラウザでみると左につまっちゃうかも)


テーブルが冗長になりますがこれでも
WHERE 月曜=1で、田中さん、鈴木さんがヒットします

>ビット積をつかう処理

月曜=1,火曜=2,水曜=4,木曜=8,金曜=16,土曜=32,日曜=64
をたします。

ユーザー 曜日
田中さん 7
鈴木さん 21
木村さん 22

となり、この場合ビット積で月曜をだしたいのであれば

WHERE 曜日 & 1

で、月曜OKな人が抽出できます。
(火曜なら WHERE 曜日 & 2 ・・・)
ただし前回も書きましたが、このやり方はSQLのチューニングに
向いていないので、データはすごく小さくなりますが、実際の
処理はおそいです。
    • good
    • 0
この回答へのお礼

とってもわかりやすい説明で助かりました!
まだまだ駆け出しなので SQL的、SQLらしく という言葉がどういう構成を
表すのかわからなかったのですが、非常に理解出来ました

もう一度 正規化について調べ直してみたところ、一番ダメなことを
やってるんだなーと苦笑w
バカな質問をしていたんだと今さら気が付いて恥ずかしい限りです

それにしても、構造を考えるのは難しいですね
これは色んなものを沢山作って経験を積むしかないのかな
SQLの勉強はネット検索のみ、で基礎もろくに無い状態(PHPもですが)
なので、一度くらいはキッチリ書籍などを読むべきでしょうか
オススメの書籍など、もしあれば一例挙げて頂けると嬉しいです

いつも的確な回答を下さって、yambeさんには大変感謝しています
書籍について、レスを頂けるかもと期待して 締め切りは明日にしますね

お礼日時:2009/09/29 21:34

>オススメの書籍など、もしあれば一例挙げて頂けると嬉しいです



ラクダ本・・・とか言うとかっこいいところですが、私は読んだことはありません。

参考までに手元にあるMySQL関連の書籍だとこんなかんじ
1.「MySQL & PHP でつくるWebデータベース」 エーアイ出版刊 2002年
2.「MySQLによる最速RDBMS構築ガイド」ソフトバンクパブリッシング刊 2005年
3.「現場で使えるMySQL」翔泳社刊 2006年

※実際のところ、購入当時の最新のもので、他にあまり選択肢が
なかったため選んだので、今となってはだいぶ古いと思います。
ここ数年で丁寧でわかりやすい解説書がだいぶ増えたので、ご自身で
読みやすいものを探されることをお勧めします。

あとはWEBで最低限以下はみておいて損はないでしょう

http://dev.mysql.com/doc/refman/4.1/ja/index.html
http://www.mysql.gr.jp/
http://itpro.nikkeibp.co.jp/article/COLUMN/20060 …
    • good
    • 0
この回答へのお礼

参考URLと書籍紹介ありがとうございました

ラクダ本って、OREILLYの本ですよね
こちらの書籍は割といい評判を聞くので、購入を考えてみますね

本を読むだけでいきなりスキルアップとはいかないのでしょうけど
基礎や考え方を身に付けるために、一読してみようと思います

回答ありがとうございました
また質問を見かけましたら、よろしくお願い致します

お礼日時:2009/09/30 21:40

まずSQLらしく作りたいなら正規化をすることです。


つまり、月~日分1案件につき1データもつわけです。
データの持ち方としては若干非効率です。
(検索性は一番高いですが)

もう一つは曜日のように7日固定で可変サイズではないような
ものはそれぞれにフィールドを用意することですね。
そうしておけば、通常の正規化データより高速になりそうです。

フィールドの使い方だけ気にするなら、ビット積をつかう処理も
考えられますが、ヒットはしますが、チューニングはできませんので
スピードは期待できません。
管理データが膨大になってくると若干時間がかかるかもしれません
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます!(いつも助かっております^^)

>月~日分1案件につき1データもつわけです。

スミマセン こちらのデータの持ち方がイメージ出来ず…
例えば月曜日のテーブルに、シリアル番号のようなものを入れていく
とか、そういう感じですか??
大変お手数なのですが、参考例を教えて頂けると嬉しいです

曜日データは一人につき3つまで保持するので、ちょっと手抜きをして
今回の構成にしてみたのですが、やっぱりダメみたいですね笑
(これに対するレスがビット積のくだりということでしょうか)

色々な方法がありそうなので、しばらく参考意見を募りたいと思います!

お礼日時:2009/09/29 18:59

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