我有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();
我错过了什么?
答案 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');