2013-03-02 124 views
1

我想從符合數組的多個條件的數據庫中獲取數據。我可以在數組中設置多個Codeigniter Where標準嗎?

陣列是這樣的:

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

鍵爲一個問題ID和值是是或否。

我需要找到電影,其中的question_id = 211,爲question_id = 23價值0和價值question_id = 191。我把它們存儲的方式是這樣的:

enter image description here

所以,我首先想到的是讓每一個數據,然後把它們放到一個更大的陣列。如果電影顯示的次數與陣列中元素的數量相同,那麼我認爲它是一個很好的匹配。但這似乎效率低下。我寧願找到符合標準的電影。

由於有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 s的循環方式。然後使用其中的值運行查詢。這似乎不起作用,有什麼我可以做的嗎?

+0

題外話:phpMyAdmin的提高了很多,因爲是你的截圖貼。考慮升級;) – 2013-03-02 22:48:35

+0

好的將做 - - 123456 – 2013-03-02 22:49:59

+0

另外,我願意打賭有一個很好的方式來做到這一點純SQL ...沒有PHP需要。 – 2013-03-02 22:52:04

回答

0

試着像這樣做。

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

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

PS。 $ i ++究竟在循環中做什麼?

+0

這是否會尋找一個單一的記錄事項?我的意思是,我設置它的方式(如上圖所示)是我對同一部電影有許多不同的記錄。當我運行它時,即使它正在檢查不同的記錄,我如何能夠提取電影?你懂我的意思嗎? – 2013-03-03 01:23:49

+0

另外,WHERE 1是什麼意思? – 2013-03-03 01:25:26

+0

對於你的第一個問題,電影ID將在返回$查詢否可用? WHERE 1只是給你一個建立$ where變量的起點,這意味着基本返回所有東西,然後foreach會建立過濾器。 – 2013-03-03 15:44:15

1

如何使用WHERE IN(array())?

CI User Guide

$names = array('Frank', 'Todd', 'James'); 
$this->db->where_in('username', $names); 
// Produces: WHERE username IN ('Frank', 'Todd', 'James') 
1

使用where_in方法列表:

$this->db->where_in('value', $array); 
0

我認爲這是正確的道路要走,你應該小心使用「或」而不是由於邏輯問題(我的意思是question_id = 1和value = 1,question_id = 2和value = 0,所以使用完整的「ands」不會因爲告訴我們想要question_id = 1而返回任何行question_id = 2不會匹配任何東西!,這同樣適用於「v alues「)。

 $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; 
+0

我已經看到,這可以在一個foreach中完成,所以爲了獲得最佳可見性,我是這樣做的,但是您可以執行'$ this-> db-> or_where(「(question_id = $ key和value = $價值)「);'在第一個foreach避免第二個。 – dennisbot 2013-03-03 03:07:16

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(); 

編碼快樂---> :)

相關問題