2015-04-22 5 views
0

Я создаю сайт, на котором пользователи могут оценивать предметы (скажем, книги) от 1 до 5 звезд. Я создал базу данных MySQL и таблицу, в которой хранится информация о каждом рейтинге (itemid, userid, ratingValue).MySQL: AVG, когда нет соответствующих строк

Каждый элемент имеет специальную веб-страницу, и я хотел бы рассказать об этой странице о: (1) количестве оценок и (2) среднем рейтинге. Я думал, что это лучше всего сделать с точки зрения. Размышляя о запросах MySQL использовать в представлении, я пришел:

SELECT ItemID, COUNT(ratingValue), IFNULL(AVG(ratingValue),0) FROM reviews GROUP BY ItemID

Проблема: если элемент еще не оценили, он не будет отображаться на запросе. Мне бы хотелось, чтобы все элементы отображались в результате запроса (view), и если есть элемент без отзывов, он должен появиться с информацией, что есть 0 отзывов и что средний рейтинг - это какое-то произвольное значение, скажем, 0.

Из official documentation,

AVG() возвращает NULL, если не было подходящих строк

и по этой причине я пытался использовать функцию IFNULL(). Однако это не работает. Например, в базе данных с пунктами 1,2,3,4,5, где пункт 5 не имеет отзывов, я получаю:

 

ItemID COUNT(Rating) IFNULL(AVG(ratingValue),0) 
1   4    4.0000 
2   2    4.0000 
3   2    3.5000 
4   3    5.0000 

Любые идеи о том, как преодолеть эту проблему?

ответ

0

Вам понадобится другая таблица, в которой перечислены все ваши товары (независимо от того, есть ли у них отзывы), и оставите их в таблице reviews. Без этого невозможно сделать вывод из таблицы reviews, в которой могут существовать предметы, которые не имеют отзывов.

Так что-то вроде:

SELECT 
    i.itemID AS itemID, 
    COUNT(r.rating) AS ratingCount, 
    AVG(ratingValue) AS averageRating 
FROM items AS i 
LEFT JOIN reviews AS r 
    ON i.itemID = r.itemID 
GROUP BY i.itemID 

Это должно дать результаты, как:

ItemID ratingCount averageRating 
1  4    4.0000 
2  2    4.0000 
3  2    3.5000 
4  3    5.0000 
5  0    NULL 
+0

Это сработало! Я никогда не думал использовать LEFT JOIN, но это действительно хорошее решение. –

Смежные вопросы