2011-12-02 38 views
-1

如何編寫查詢來選擇具有JSON數組的列的條件? 即 假設我在ci_sessions中添加了user_name,user_role。而user_data是JSON數組。如何通過條件選擇MySQL中的JSON列?

SELECT * 
FROM `ci_sessions` where user_data[user_role]='admin'; 
       *********************/\*************** 

這裏的條件是需要設計的。我需要具有user_role「admin」的數據。

更新:檢查user_role「admin」是條件的主要目標。

有什麼方法可以在條件下添加user_data[user_role]user_data->user_role

更新:這是PostgresSQL DB中可能的。

+5

這是一個可怕的設計。如果您需要查詢user_role字段,它應該是它自己的列。 – nickb

+0

我知道這是可怕的設計。但Stack Overflow的專業人員非常聰明。查詢不可能嗎?或者通過編寫子查詢?什麼? –

+0

所以根本不可能通過sql查詢來檢查這個條件嗎? –

回答

0

我是守在等待這種類型的查詢,但我沒有這樣做。這就是爲什麼我結合了SQL和PHP。

  1. 我已經從所有ci_sessions表中獲得結果。
  2. 然後我通過JSON arraY的解碼字段檢查結果。它工作正常。
SELECT * FROM `ci_sessions`; 
foreach ($result as $row) { 
      $user_data=$row->user_data; 
      foreach (unserialize($user_data) as $k => $v) { 
       $final[] = array('key' => $k, 'value' => $v); 
       if($k=='user_role' && $v='admin') { 
//make array of admin information required to show 
       } 

      } 
     } 
1

不知道你在那裏做什麼,但你只需撥打$this->session->userdata('user_role'),CI會自動選擇如何檢索該值。如果您設置(並且我認爲您已經)使用數據庫,則查詢將自動執行。

我不明白你是如何真正保存你的會話變量,如果你自己json_encoded()或你指的是由CI執行的編碼。

在後面,你只是:

if($this->session->userdata('user_role') == 'admin') 
{ 
// do stuff 
} 

否則,$role = json_decode($this->session->userdata('user_role'));和檢查數組,但我不能幫你在這裏多,因爲你沒有提供明確的信息

+0

通過:$ this-> session-> userdata('user_role')=='admin',我會得到只有用戶是admin或不。我想顯示'admin'和現在登錄的用戶。我可以通過查詢獲得這些信息嗎 –

+0

查詢不可能嗎?或者通過編寫子查詢?什麼? –