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

就職支援のWebSiteを作っています。

【】

//companyテーブル
company_id ----- 企業ID
company_name -- 企業名
treatment ------ 待遇情報(配列を結合させた数字だけの情報)
・・・

//treatmentテーブル
treatment_id ----- 企業ID
treatment_data -- 待遇情報(日本語での正式名称)
・・・

【待遇情報例】 

交通費支給□ ボーナス有り□ 社宅・寮完備□ etc・・・

【流れと状況】

(1)
企業側が待遇データをチェックボックスで選択して登録

(2)
チェックボックスの値(配列)を連結させてtreatmentカラムに 001000111001000・・・ と言う形で格納

ここまでは出来ているのですが、検索する時複数並んだチェックボックスにチェックを入れてtreatmentカラム( 001000111001000・・・ )と比較させて、1が重なる企業だけを一覧を表示させたいのです。

※001000111001000・・・の並び順はtreatmentカラムのレコード順(treatment_id)と対応させています。

経験不足の為良い考えが浮かびません。

こう言う場合はこう言う作りをした方が良い等、そう言ったご意見でもいただければ助かります。

宜しくお願いします。

※企業(1):他カラム(多)であれば同じ格納方法~抽出まで出来ています。

A 回答 (2件)

2進数演算のビット積を使うといいかも。


MySQL テーブルのデータが 01 羅列の文字列なら、conv関数で2進数にし、入力値の方も同様に 2進数として、ビット積 & をとる。
これだけだと、どれかの項目が1であれば引っかけてしまうので、さらに元のビット位置と全部同じか比較する。
よって、treatment の 1 のところが全部1であるものは、以下が成り立つ
where (CONV(`treatment`,2,2) & CONV('01・・入力値',2,2)) = CONV(`treatment`,2,2)

ただし、treatmentの桁数に変更がない、全て同じ桁数で入っているという前提なので、
今後、treatmentの項目数に変動があると、うまく抽出できなくなるので、項目ごとのカラムにしてしまうのも一つの方法かと思います。
    • good
    • 0
この回答へのお礼

有難う御座います。大変参考になりました!
知らない関数ばかりでもう少し勉強してみます!

お礼日時:2012/02/07 20:54

拡張性やメンテナンス性を考えれば、変に連結して処理せずに


正規化して処理した方がよいですよ
結果としてスピードも速くなると思います。
    • good
    • 0
この回答へのお礼

有難う御座います!参考になりました!

お礼日時:2012/02/07 20:52

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