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"');

上面的查询给出了正确的输出。

但是,当我使用 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>

似乎问题出在子查询上。

谁能帮我解决这个问题?

4

2 回答 2

1

问题是条件将您的表别名g作为字符串的子查询'g.gallery_id'避免CI的保护字段的一种方法是将第三个参数作为false在where条件中传递,因此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);

或简单地手动编写您的条款

  $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);
于 2013-04-08T10:07:54.793 回答
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' 它应该用作演示。

如果您不知道如何补救,请发表评论。(这可能只是使用单引号的问题)。

于 2013-04-08T10:00:47.557 回答