Question

I have in my DB these 2 tables:

LESSONS                RATINGS
ID | NAME              ID | LESSON | RATING
1    lesson1           1    1        4
2    lesson2           2    2        2
3    lesson3           3    1        5
4    lesson4           4    4        2
5    lesson5           5    3        1
6    lesson6           6    2        5
7    lesson7           7    6        3

And I want a View that show me something like this:

LESSONS_RATINGS
IDL| NAME     | RATING        
1    lesson1    4.5
2    lesson2    3.5
3    lesson3    1
4    lesson4    2
5    lesson5    NULL
6    lesson6    3
7    lesson7    NULL

But what I've been able to get so far is this:

LESSONS_RATINGS
IDL| NAME     | RATING        
1    lesson1    4.5
2    lesson2    3.5
3    lesson3    1
4    lesson4    2
6    lesson6    3

Notice that NULL records are missing. That's why in table RATINGS there are no records of lessons 5 and 7. I'm doing this:

CREATE OR REPLACE VIEW `LESSONS_RATINGS` AS
select 
    `l`.`ID` AS `IDL`,
    `l`.`NAME` AS `NAME`,
    CASE WHEN AVG(`lr`.`RATING`) IS NULL THEN NULL ELSE AVG(`lr`.`RATING`) END AS `RATING`
from
    `LESSONS` AS `l`,
    `RATINGS` AS `lr`
where
    (`l`.`ID` = `lr`.`ID`)
group by `l`.`ID`;
Was it helpful?

Solution

Use an OUTER JOIN:

select 
    `l`.`ID` AS `IDL`,
    `l`.`NAME` AS `NAME`,
    AVG(`lr`.`RATING`) AS `RATING`
from
    `LESSONS` AS `l` LEFT JOIN `RATINGS` AS `lr`
        ON `l`.`ID` = `lr`.`ID`
group by `l`.`ID`;

Also, I don't think there is a need for the Case statement -- you can just use AVG(lr.rating).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top