小島健太郎
kojim****@gmail*****
2012年 7月 3日 (火) 22:25:57 JST
こんばんは。 ご回答ありがとうございます。 > この結果では、次の2つの文が実行されていないように見えます。 > これはなぜなのでしょうか? お心当たりありますか? すみません、説明不足でしたが、dept_idとindex_nameは 検索ボックスに入力がなかったら、該当する$this->db->where文は 実行されないようにしておりました、 質問時は未入力で実行した結果を記載してしまいました。 紛らわしいことをしてすみません。 > また、使用したデータベースドライバーは何でしょうか? データベースドライバは同じくMySQLです。 環境を詳しく申しますと、XAMPP for Windows version1.7.3より Apache,MySQLを起動して使用しています。 明日会社にてもう一度orwhereを試してみたいと思います。 複雑なSQL文を書きたい場合はquery()を使えばよいのですね。 大変参考になりました。 2012年7月3日 21:06 戸田 広 <info****@sciss*****>: > こんばんは、戸田です。 > > > On 2012/07/03, at 10:13, 小島健太郎 wrote: > >> モデルで下記のSQLを使用していますが >> 最終行のorwhere分を追加すると、返される結果が0件となってしまいます。 >> >> function getAll($index_no,$index_no_first,$index,$dept_id){ >> >> $this->db->select("*"); >> $this->db->from("t_reply"); >> $this->db->join("M_dept","T_reply.dept=M_dept.dept_id","left"); >> $this->db->like("T_reply.index_no",$index_no,"after"); >> $this->db->like("T_reply.index_name",$index); >> $this->db->where("T_reply.dept",$dept_id); >> $this->db->orwhere("T_reply.index_no_first",$index_no_first);//←問題の行 >> >> return $this->db->get(); >> } > > 1.7.3 の環境で、全く同じメソッドを持つモデルクラスを作って > 試しに CLI で、MySQL データベースドライバーで実行しましたが、 > プロファイラーは次のようなSQL文を表示しました(見やすいよう整形しています)。 > > ======================================== > SELECT > * > FROM > (`t_reply`) > LEFT JOIN > `M_dept` > ON > `T_reply`.`dept`=`M_dept`.`dept_id` > WHERE > `T_reply`.`dept` = 1 > OR > `T_reply`.`index_no_first` = '2' > AND > `T_reply`.`index_no` LIKE '2.5%' > AND > `T_reply`.`index_name` LIKE '%1%' > ; > ======================================== > >> SELECT * >> FROM (`t_reply`) >> LEFT JOIN `M_dept` ON `T_reply`.`dept`=`M_dept`.`dept_id` >> WHERE `T_reply`.`index_no_first` = '2' >> AND `T_reply`.`index_no` LIKE '2.5%' > > この結果では、次の2つの文が実行されていないように見えます。 > これはなぜなのでしょうか? お心当たりありますか? >> $this->db->like("T_reply.index_name",$index); >> $this->db->where("T_reply.dept",$dept_id); > また、使用したデータベースドライバーは何でしょうか? > > > なお、orwhere() は or_where() に引数を渡すだけのエイリアスですので > or_where() と同じ結果になります。 > > >> また、SQL文で微妙に括弧()を操作したいとき >> 何か記述方法はあるのでしょうか? > > Active Record を使わないのでよろしければ、 > query() を使った方が手っ取り早いと思います。 > > > > 以上です。 >