2011-05-03 64 views
4

我有2個表。SQL加入問題,如果第二個表爲空,則返回null

表1(項目):ID,名稱,類型

表2(project_ratings):PROJECT_ID,評級

有些項目沒有收視率。

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。該查詢僅返回具有評級的那些查詢。

我試過左連接,右連接,全連接,還是同樣的事情。

用笨的活動記錄:

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

我缺少什麼?

+1

這是一個'LEFT JOIN'的定義,但我認爲你的'AVG'骨料的使用是不會對這個 – Phil 2011-05-03 02:11:25

+0

工作我試過左連接...仍然返回1結果..我想全部 – tpae 2011-05-03 02:12:48

+1

我有一種感覺,你將需要一個'GROUP BY p.id,p.name'但是我仍然不認爲第三列將會顯示正確的值。我可能是錯的,但懶得自己測試 – Phil 2011-05-03 02:14:16

回答

3

當使用聚合函數(AVG()在這種情況下),你需要與非集合字段指定一個GROUP BY條款,如

GROUP BY p.id, p.name 

,以確保所有project引用都存在,無論加入了收視率,使用LEFT JOIN

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'; 

(我不知道該怎麼做,在笨:)

3

你想要的SQL將

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

我不知道如何用代碼點火器來做到這一點。

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。

0

你可以得到一個外連接的做到這一點:

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