2013-04-08 40 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