1

配列の複数の基準を満たすデータベースからデータを取得しようとしています。

配列は次のようなものです。

Array ([21] => 1,[23] => 0,[19] => 1);

キーは質問IDであり、値はyesまたはnoのいずれかです。

question_id = 21の値が1、の値question_id = 23がで、の値がである映画を見つける必要があり0ます。それらを保存する方法は次のようになります。question_id = 191

ここに画像の説明を入力してください

したがって、私の最初の考えは、それぞれのデータを取得してから、それらをより大きな配列に配置することでした。映画が配列内の要素の数と同じ回数表示される場合、私はそれが良い一致であると考えます。しかし、これは非効率的なようです。むしろ、基準に合った映画を見つけたいと思います。

同じ値のレコードがあるのでmovie_id、このようなものを書く方法はありますか?:

foreach($array as $key=>$value){
$i++;
$this->db->where('question_id', $key);
$this->db->where('value', $value);

}
$this->db->from('movies_values');
    $query = $this->db->get();
    $res = $query->result();
    array_push($main,$res);

この背後にある考え方は、すべてのWHEREのループを作成することです。次に、where値を使用してクエリを実行します。これはうまくいかないようですが、他に何かできることはありますか?

4

5 に答える 5

1

WHERE IN (array()) を使用するのはどうですか?

CIユーザーガイドから:

$names = array('Frank', 'Todd', 'James');
$this->db->where_in('username', $names);
// Produces: WHERE username IN ('Frank', 'Todd', 'James')
于 2013-03-02T23:25:34.670 に答える
1

where_inリストには次のメソッドを使用します。

$this->db->where_in('value', $array);
于 2013-03-02T23:29:49.570 に答える
0

このようにしてみてください。

$where = WHERE 1
foreach($array as $key=>$value){
   $where .= " AND(question_id = $key AND value = $value)";
}

$this->db->where($where);

PS。あなたのループで $i++ は正確に何をしていますか?

于 2013-03-02T23:15:02.927 に答える
0

これは正しい方法だと思います。完全な「and」を使用する代わりに「or」を使用するように注意する必要があります。その方法では、論理上の問題により行が返されません (つまり、question_id = 1 および value = 1 および question_id を意味します)。 = 2 と value = 0 の場合、question_id = 1 と question_id = 2 は何にも一致しない!、同じことが「値」にも当てはまります)。

        $array = array(21 => 1,23 => 0,19 => 1);
        $where = array();
        foreach($array as $key => $value) {
            $where[] = "(question_id=$key and value=$value)";
        }
        var_dump($where);
        foreach ($where as $value) {
            $this->db->or_where($value);
        }
        $q = $this->db->get('movies_values')->result();
        var_dump($q);
        echo $this->db->last_query();exit;
于 2013-03-03T02:40:45.990 に答える
0

これは、ループなしで簡単に実行できます。

$filter = array(21 => 1,23 => 0,19 => 1);

$values = implode(',',array_unique(array_values($filter))); // results into 0,1...
$keys   = implode(',',array_unique(array_keys($filter))); // results into 19,21,23...

$result = $this->db
              ->query("select * from movies_values
                         where 
                            question_id in(".$keys.")
                            and value in(".$values.")")
              ->result();

幸せなコーディング ---> :)

于 2013-03-03T12:09:17.097 に答える