php - PHP CodeIgniter 多个 LEFT OUTER 加入查询
问题描述
我正在使用 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();
匿名:是未注册用户的表
fid:是提要ID
图片:是上传到提要的所有图片的表格
items_likes:是每张图片的所有用户点赞数
items_comments:是每张图片的所有用户评论
问题是 all_comments 总是返回与 all_likes相同的值。我不确定多个 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')
更多关于加入的信息在这里
推荐阅读
- javascript - 如何在 VueJS 的选择列表中插入图标?
- python - 如何根据列值填充所有值?
- java - Java 检查数值是短、长还是整数
- python - Django:如何使用来自 rest_framework 的 APIClient 在单元测试用例中上传 CSV 文件
- java - 访问注入的属性会导致 NullPointerException
- ssis - 日期条件更新问题 SSIS?
- javascript - 当我切换到 xcode 新构建系统时,IOS 临时错误“无法安装应用程序,因为无法验证其完整性”
- r - 改变李克特量表中的绘图顺序
- http - 执行 Curl 命令行时如何使用 & 符号 (&) 作为 Url 参数分隔符而不是命令行 & 符号 (&)
- go - 如何使 Vim 自动格式化要在 Go 中大写的函数名称