微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当使用CodeIgniter活动记录类时,限制SQL连接

如何解决当使用CodeIgniter活动记录类时,限制SQL连接

| 我正在获取产品清单。每个产品可能有一个或多个图像,我只想返回第一个图像。
$this->db->select(\'p.product_id,p.product_name i.img_name,i.img_ext\');    
$this->db->join(\'products_images i\',\'i.product_id = p.product_id\',\'left\');
$query = $this->db->get(\'products p\');
无论如何,是否使用CI活动记录类将db-> join限制为1条记录?     

解决方法

在调用
$this->db->get(\'products p\');
之前加
$this->db->limit(1);
。请参阅ellislab.com上的文档:在页面上搜索限制。 编辑:我误读了您试图将LIMIT应用于内部JOIN语句的事实。 不能。由于您不能在常规SQL中对内部JOIN语句执行LIMIT,因此无法使用Code Igniter的ActiveRecord类执行此操作。     ,您可以通过
left
连接使用
$this->db->group_by
实现您想要的:
$this->db->select(\'products.id,products.product_name,products_images.img_name,products_images.img_ext\');
$this->db->from(\'products\');
$this->db->join(\'products_images\',\'products_images.product_id = products.id\',\'left\');
$this->db->group_by(\'products.id\'); 
$query = $this->db->get();
这应该给您结果ѭ6(不重复产品),并且
products_images
的第一条匹配记录会加入到每个结果行。如果联接表中没有匹配的行(即,如果缺少图像),您将获得product_images字段的空值,但仍会从
products
表中看到结果。     ,要扩展@Femi的答案: 没有很好的方法来限制ѭ9,实际上,您实际上并不想这样做。假设
products_image.product_id
products.id
都具有索引(如果您要反复对它们进行连接,它们绝对应该如此)在数据库引擎进行连接时,它将使用索引来确定需要获取哪些行。然后,引擎使用结果确定磁盘上需要查找的记录的位置。如果你 通过运行以下SQL语句,您应该能够看到不同之处:
EXPLAIN 
SELECT p.product_id,p.product_name,i.img_name,i.img_ext
FROM products p
LEFT JOIN products_images i
    ON i.product_id = p.product_id
相对于:
EXPLAIN  
SELECT p.product_id,i.img_ext
FROM (SELECT product_id,product_name FROM products) p 
LEFT JOIN (SELECT img_name,img_ext FROM products_images) i
    ON i.product_id = p.product_id
第一个查询应该有一个索引,第二个查询没有。如果数据库中有很多行,则应该有性能差异。     ,如果解决这个问题的方法也是如此,那就是遍历结果并删除当前对象(如果product_id在先前的对象中已经存在)。创建一个数组,将product_id \推到该数组中,同时检查它们是否重复。
$product_array = array();
$i = 0;

foreach($result as $r){

    if(in_array($r->product_id,$product_array)){
        unset($result[$i]);
    }else{
        array_push($product_array,$r->product_id);
    }
    $i++;

} 

$result = array_values($result); //re-index result array
现在$ result是我们想要的     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。