SQL Join вопрос, возвращает ноль, если вторая таблица пуста - PullRequest
4 голосов
/ 03 мая 2011

У меня есть 2 таблицы.

таблица 1 (проекты): идентификатор, имя, тип

таблица 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, если нет оценок. Этот запрос возвращает только те, которые имеют рейтинги.

Я пробовал левое соединение, правое соединение, полное соединение, все то же самое.

Использование активных записей 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 ]

3 голосов
/ 03 мая 2011

При использовании агрегатной функции (в данном случае AVG()) необходимо указать предложение GROUP BY с неагрегированными полями, например,

GROUP BY p.id, p.name

Для обеспечения всех ссылок projectприсутствуют независимо от объединенных рейтингов, используйте LEFT JOIN.

3 голосов
/ 03 мая 2011

sql, что вы хотите, будет

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

Я не уверен, как это сделать с воспламенителем кода.

2 голосов
/ 03 мая 2011

Попробуйте это:

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

Если рейтинг отсутствует, средний рейтинг будет равен NULL.

0 голосов
/ 03 мая 2011

Вы можете получить внешнее соединение, сделав это:

    $this->db->join('project_ratings pr', 'p.id = pr.project_id', 'outer');
0 голосов
/ 03 мая 2011

Запрос должен быть:

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:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...