【问题标题】:PHP CodeIgniter multiple LEFT OUTER join in on queryPHP CodeIgniter 多个 LEFT OUTER 加入查询
【发布时间】:2019-10-28 09:09:29
【问题描述】:

我正在使用 PHP CodeIgniter 从我的数据库中查询。我需要使用多个 LEFT OUTER 连接。连接使用多个条件(我不确定它是否受 bug 支持)。我的查询结果对于我要获取的两个参数具有相同的值:

查询:

$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();

anonymous:是一个未注册用户的表

fid:是提要id

images:是上传到 Feed 的所有图片的表格

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

items_cmets:每张图片是所有用户的cmets


问题是 all_cmets 总是返回 same 值作为 all_likes。 我不确定多个 LEFT-OUTER 连接是否是问题所在,或者我在每个连接语句中都使用了多个条件,即

items_cmets.uid = 匿名.uid 和 items_cmets.fid = 匿名.fid

日志结果:

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

虽然我有 12 个赞,但 cmets 应该是 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();

【问题讨论】:

    标签: php mysql sql codeigniter left-join


    【解决方案1】:

    左外连接从表 A 中产生一组完整的记录,其中 表 B 中的匹配记录(如果有)。如果没有 匹配,右侧将包含 null。

    你需要添加包含NULL的记录

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

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

    关于加入here的更多信息

    【讨论】:

    • 你的意思是:IS NOT NULL
    • 不,如果您查看我链接的解释左外连接的图表,您会看到表 B 是在表 A 帖子上创建的 cmets。因此,加入后,您希望从表 B 中排除所有 NULL(无 cmets),以获取表 A 中带有注释 (B) 的元素列表。我不知道你的表格方案,你可能需要适应这个,但这是概念......
    • 谢谢,我会检查并建议
    猜你喜欢
    • 1970-01-01
    • 2011-03-15
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2016-06-01
    相关资源
    最近更新 更多