2013-04-08 110 views
2
$query=$this->db->query('SELECT g.gallery_id, g.gallery_title, (
          SELECT i.gallery_image_path 
          FROM nepal_gallery_image AS i 
          WHERE i.gallery_id = g.gallery_id 
          AND i.gallery_image_status = "Enabled" 
          LIMIT 0 , 1) AS gallery_image_path 
         FROM nepal_gallery AS g 
         WHERE g.gallery_status = "Enabled"'); 

上面的查詢給出了正確的輸出。CodeIgniter子查詢的問題

然而,當我使用CI子查詢庫:

$this->load->library('Subquery'); 
$this->db->select('g.gallery_id,g.gallery_title'); 
$sub = $this->subquery->start_subquery('select'); 
$sub ->select('i.gallery_image_path') 
    ->from('nepal_gallery_image AS i')     
    ->where(array('i.gallery_image_status'=>"Enabled", 
        'i.gallery_id'=>"g.gallery_id")) 
    ->limit(0,1); 
$this->subquery->end_subquery('gallery_image_path'); 
$this->db->from('nepal_gallery AS g'); 
$this->db->where('g.gallery_stats',"Enabled"); 
$query=$this->db->get(); 

結果查詢是:

SELECT `g`.`gallery_id` , `g`.`gallery_title` , (
    SELECT `i`.`gallery_image_path` 
    FROM (`nepal_gallery_image` AS i) 
    WHERE `i`.`gallery_image_status` = 'Enabled' 
    AND `i`.`gallery_id` = 'g.gallery_id' 
    LIMIT 0 , 1) AS gallery_image_path 
FROM (`nepal_gallery` AS g) 
WHERE `g`.`gallery_status` = 'Enabled' 

,並沒有如預期的輸出。

在第一個查詢輸出

<table> 
    <tr> 
     <th> gallery_id</th> 
     <th> gallery_title</th> 
     <th> gallery_image_path </th> 
    </tr> 
    <tr> 
     <td>1</td> 
     <td>Gallery 1</td> 
     <td>images/image1.jpg</td> 
    </tr> 
    <tr> 
     <td>2</td> 
     <td>Gallery 2</td> 
     <td>images/image2.jpg</td> 
    </tr> 
    </table> 

然而,在後來的查詢,輸出是

<table> 
    <tr> 
     <th> gallery_id</th> 
     <th> gallery_title</th> 
     <th> gallery_image_path </th> 
    </tr> 
    <tr> 
     <td>1</td> 
     <td>Gallery 1</td> 
     <td>NULL</td> 
    </tr> 
    <tr> 
     <td>2</td> 
     <td>Gallery 2</td> 
     <td>NULL</td> 
    </tr> 
    </table> 

看來問題是子查詢。

任何人都可以幫助我嗎?

+0

很抱歉,但以何種方式是不是儘可能精確預期? – 2013-04-08 09:13:03

+0

在第一查詢的輸出是 gallery_id gallery_title gallery_image_path 1圖庫1個圖像/ gallery1_1234.jpg 2圖庫2個圖像/ gallery2_1234.jpg 然而,在後來的查詢時,輸出是 gallery_id gallery_title gallery_image_path 1圖庫1 NULL 2 Gallery 2 NULL 看來問題出在子查詢上。 – rohan 2013-04-08 09:53:34

+0

我認爲你應該加上這個問題 – 2013-04-08 09:58:05

回答

1

問題是子查詢的條件是把你的表別名g作爲字符串'g.gallery_id'避免CI保護字段的一種方法是通過在條件中傳遞第三個參數爲false,因此CI不會嘗試保護你的字段或錶帶反引號的名字。

試試這個

$sub ->select('i.gallery_image_path') 
->from('nepal_gallery_image AS i')     
->where(array('i.gallery_image_status'=>"Enabled", 
       'i.gallery_id'=>"g.gallery_id"), NULL, FALSE); 
              //--^^^^^^^^^^^^^^--here 
->limit(0,1); 

或簡單的寫你的條款manaully

$where = "i.gallery_id = g.gallery_id AND i.gallery_image_status = 'Enabled'"; 
    $sub ->select('i.gallery_image_path') 
->from('nepal_gallery_image AS i')     
->where($where,NULL,FALSE); 
->limit(0,1); 
+0

非常感謝。它解決了這個問題。 – rohan 2013-04-08 10:21:59

0
->where(array('i.gallery_image_status'=>"Enabled", 
       'i.gallery_id'=>"g.gallery_id")) 

問題是與「i.gallery_id」 =>「g.gallery_id」 - CI正在建設的查詢與「g.gallery_id」作爲一個字符串...當它奧特是一個表列參考。如果您手動將「g.gallery_id」替換爲「g」。「gallery_id」,它應該用作演示。

如果你不知道如何補救,請留下評論。 (這可能只是使用單引號的問題)。

+0

使用單引號沒有幫助。問題依然存在。 – rohan 2013-04-08 10:09:45

+0

bipen的解決方案提供瞭解決上述問題的方法。 – 2013-04-08 10:12:08