SQL Join问题,如果第二个表为空,则返回null

时间:2011-05-03 02:08:58

标签: php sql codeigniter

我有2张桌子。

表1(项目):id,name,type

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

我错过了什么?

5 个答案:

答案 0 :(得分:3)

你想要的SQL是

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

我不确定如何使用代码点火器。

答案 1 :(得分:3)

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

GROUP BY p.id, p.name

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

答案 2 :(得分:2)

试试这个:

$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。

答案 3 :(得分:0)

查询应该是:

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中执行此操作:)

答案 4 :(得分:0)

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

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