PHP CodeIgniter多个LEFT OUTER在查询中加入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP CodeIgniter多个LEFT OUTER在查询中加入相关的知识,希望对你有一定的参考价值。

我正在使用php CodeIgniter从我的数据库中查询。我需要使用多个LEFT OUTER联接。联接使用多个条件(从错误开始,我不确定它是否受支持)。我要获取的两个参数的查询结果具有相同的值:

查询:

$this->db->select('anonymous.*,
    count(items_likes.id) as all_likes, count(items_comments.id) as all_comments');
    $this->db->from('anonymous');
    $this->db->where('anonymous.fid', $feed_id);

    $this->db->group_by('anonymous.id');

    $this->db->join('all_users', 'all_users.id = anonymous.uid', 'left outer');
    $this->db->join('images', 'images.ud = anonymous.uid AND images.fid = anonymous.fid', 'left outer');
    $this->db->join('items_likes', 'items_likes.uid = anonymous.uid AND items_likes.fid = anonymous.fid', 'left outer');

    $this->db->join('items_comments', 'items_comments.uid = anonymous.uid AND items_comments.fid = anonymous.fid', 'left outer');

    $list = $this->db->get()->result();

匿名:是具有未注册用户的表

fid:是提要ID

图像:是上载到提要中的所有图像的表

items_likes:每张图片的所有用户赞数

item_comments:是每个图像的所有用户评论


问题在于,all_comments始终以all_likes的形式返回same值。我不确定是多个LEFT-OUTER联接是问题还是我在每个联接语句中都使用多个条件的事实,即

items_comments.uid =匿名.uid和items_comments.fid =匿名.fid

日志结果:

"all_likes":"12","all_comments":"12"

尽管我有12个赞,但评论应为3

如果我按如下方式编写查询,则结果正常:

$this->db->select('anonymous.*,
(SELECT count( items_likes.id ) FROM items_likes WHERE items_likes.uid = anonymous.uid AND items_likes.fid = anonymous.fid) as all_likes, 
(SELECT count( items_comments.id ) FROM items_comments WHERE items_comments.uid = anonymous.uid AND items_comments.fid = anonymous.fid) as all_comments');
$this->db->from('anonymous');
$this->db->where('anonymous.fid', $feed_id);

$this->db->group_by('anonymous.id');

$this->db->join('all_users', 'all_users.id = anonymous.uid', 'left outer');
$this->db->join('images', 'images.ud = anonymous.uid AND images.fid = anonymous.fid', 'left outer');
//$this->db->join('items_likes', 'items_likes.uid = anonymous.uid AND items_likes.fid = anonymous.fid', 'left outer');

//$this->db->join('items_comments', 'items_comments.uid = anonymous.uid AND items_comments.fid = anonymous.fid', 'left outer');

$list = $this->db->get()->result();
答案

左外部联接从表A产生完整的记录集,表B中的匹配记录(如果有)。匹配,右侧将包含null。

您需要添加包含NULL的记录

将此where子句添加到查询中:

$this->db->->where('items_comments.uid IS NULL')    

有关加入here的更多信息

以上是关于PHP CodeIgniter多个LEFT OUTER在查询中加入的主要内容,如果未能解决你的问题,请参考以下文章

codeigniter php 和 jquery - 如何从多个表中获取数据并通过 ajax 返回

路由到 CodeIgniter 中的多个子文件夹

Codeigniter - 使用多个数据库

Codeigniter,调用多个数据库

CodeIgniter - 使用事务插入多个表

如何在 CodeIgniter 中使用多个控制器?