【问题标题】:SQL Join question, return null if second table is emptySQL Join问题,如果第二个表为空则返回null
【发布时间】:2011-08-17 09:18:56
【问题描述】:

我有 2 张桌子。

表 1(项目):id、名称、类型

表 2(project_ratings):project_id、rating

有些项目没有评级。

SELECT `p`.`id`, `p`.`name`, AVG(pr.rating) FROM (`projects` p) JOIN `project_ratings` pr ON `p`.`id` = `pr`.`project_id` WHERE `p`.`type` = 'group' OR `p`.`type` = 'user';

我想返回所有项目,如果没有任何评分则返回 NULL。这个查询只返回那些有评分的。

我试过左连接、右连接、全连接,还是一样。

使用 CodeIgniter 活动记录:

$this->db->select("p.id, p.name, AVG(pr.rating)");
        $this->db->from('projects p');
        $this->db->join('project_ratings pr', 'p.id = pr.project_id');

        $this->db->where('p.type', 'group');
        $this->db->or_where('p.type', 'user');
$res = $this->db->get();

我错过了什么?

【问题讨论】:

  • 这是LEFT JOIN 的定义,但我认为您对AVG 聚合的使用不适用于此
  • 我试过左连接...仍然返回 1 个结果..我想要所有
  • 我感觉你需要GROUP BY p.id, p.name 但是我仍然认为第三列不会显示正确的值。我可能错了,但我懒得自己测试
  • GROUP BY 成功了。如果你能把它作为一个完整的答案来回答,我可以给你信用:) 谢谢
  • 连同左外连接。忘记添加了

标签: php sql codeigniter


【解决方案1】:

试试这个:

$this->db->select("p.id, p.name, AVG(pr.rating) as average_rating");
$this->db->from('projects p');
$this->db->join('project_ratings pr', 'p.id = pr.project_id', 'left');
$this->db->where('p.type', 'group');
$this->db->group_by('p.id');
$this->db->or_where('p.type', 'user');
$res = $this->db->get();

如果没有评分,average_rating 将为 NULL。

【讨论】:

    【解决方案2】:

    您可以通过以下方式获得外连接:

        $this->db->join('project_ratings pr', 'p.id = pr.project_id', 'outer');
    

    【讨论】:

      【解决方案3】:

      使用聚合函数时(本例中为AVG()),您需要指定带有非聚合字段的GROUP BY 子句,例如

      GROUP BY p.id, p.name
      

      要确保所有 project 引用都存在,无论加入评级如何,请使用 LEFT JOIN

      【讨论】:

        【解决方案4】:

        你想要的sql是

                 SELECT *
                   FROM projects
        LEFT OUTER JOIN project_ratings ON projects.id = project_ratings.project_id
        

        我不确定如何使用代码点火器来做到这一点。

        【讨论】:

          【解决方案5】:

          查询应该是:

          SELECT `p`.`id`, `p`.`name`, AVG(pr.rating) 
          FROM (`projects` p) 
              LEFT OUTER JOIN `project_ratings` pr ON `p`.`id` = `pr`.`project_id` 
          WHERE `p`.`type` = 'group' OR `p`.`type` = 'user';
          

          (我不知道如何在 CodeIgniter 中做到这一点:)

          【讨论】:

            猜你喜欢
            • 2013-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-10-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-12
            相关资源
            最近更新 更多