2013-04-05 20 views
4

我有兩個疑問:代碼點火器 - 刪除單引號where_in

$genres = $this->db->select('Group_Concat(intGenreId) strDJGenres') 
           ->from('tblDJGenres') 
           ->where('intDJId', $this->session->userdata('non_admin_userid')) 
           ->get() 
           ->row(); 

      $results = $this->db->select('tblTracks.*, tblGenres.strName as strGenreName') 
           ->from('tblTracks') 
           ->join('tblGenres', 'tblTracks.intGenreId = tblGenres.intGenreId', 'left') 
           ->where_in('tblTracks.intGenreId', $genres->strDJGenres) 
           ->get() 
           ->result(); 

第一個查詢返回一個字符串,如

「1,2,3,4,8,6 ,5,7,45,66'

這是我在第二個查詢的where_in子句中使用的。問題是,這個字符串,它是寫像SQL:

SELECT `tblTracks`.*, `tblGenres`.`strName` as strGenreName FROM (`tblTracks`) LEFT JOIN `tblGenres` ON `tblTracks`.`intGenreId` = `tblGenres`.`intGenreId` WHERE `tblTracks`.`intGenreId` IN ('1,2,3,4,8,6,5,7,45,66') 

與周圍的報價,它被視爲一個單一的價值。我如何獲得第二個查詢來執行我想要的操作?即

.... where `tblTracks`.`intGenreId` IN (1,2,3,4,8,6,5,7,45,66) 
+0

您是否嘗試過使用的preg_replace和替換單引用沒有? – m79lkm 2013-04-05 14:27:22

回答

9

多個值可以作爲array傳遞給where_in子句。


從字符串的開始和結束的報價可以使用trim()被移除:

$dj_genres = trim($genres->strDJGenres, "'"); 

然後該字符串可被轉換成陣列串的,傳遞給where_in子句的第二個查詢。

$dj_genres_array = explode(",", $dj_genres); 

或者,如果你需要一個整數數組的:

$dj_genres_int_array = array_map('intval', $dj_genres_array); 

您可以將合成陣列只需添加到第二個查詢:

// ...  
->where_in('tblTracks.intGenreId', $dj_genres_array) 
// ... 

或者:

由JLeft給出
// ...  
->where_in('tblTracks.intGenreId', $dj_genres_int_array) 
// ... 
+0

我正在給'where_in'添加一個子查詢,所以我修剪了字符串,使用字符串替換了函數,但它沒有幫助。你可以請建議我這裏的東西是我的[問題](https://stackoverflow.com/questions/44926109/need-where-in-which-work-as-and-for-each-value-with-join-query -in-笨) – 2017-07-06 08:42:58

1

答案:

從一開始和字符串的末尾的引號可以使用以下函數來刪除:

$dj_genres = trim($genres->strDJGenres, "'"); 

該字符串可然後被轉換成一個陣列要傳遞給第二個查詢的where_in子句。

$dj_genres_array = explode(",", $dj_genres); 

如果您需要整數數組,可以爲這樣產生的:

$dj_genres_int_array = array_map('intval', $dj_genres_array); 

是工作絕對沒問題...謝謝JLeft