Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Базы данных MySQL

  Все выпуски  

RFpro.ru: Базы данных SQL


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

_Ayl_
Статус: Студент
Рейтинг: 1355
∙ повысить рейтинг »
Гуревич Александр Львович
Статус: 10-й класс
Рейтинг: 568
∙ повысить рейтинг »
leonid59
Статус: 8-й класс
Рейтинг: 438
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Базы данных SQL

Номер выпуска:444
Дата выхода:27.09.2009, 18:00
Администратор рассылки:Victor Pyrlik, Модератор
Подписчиков / экспертов:604 / 177
Вопросов / ответов:1 / 3

Вопрос № 172490: Доброго времени суток! Делаю систему оценки качества товаров на MySQL и PHP. Что может быть проще, создать таблицу с голосами за товар и выводить средний рейтинг. Табличку для хранения голосов создал с полями what и vote (ID товара и оценка ...



Вопрос № 172490:

Доброго времени суток!
Делаю систему оценки качества товаров на MySQL и PHP.
Что может быть проще, создать таблицу с голосами за товар и выводить средний рейтинг.
Табличку для хранения голосов создал с полями what и vote (ID товара и оценка соответственно). Выбрать количество голосов и подсчитать сумму всех голосов, а также вычислить среднюю оценку можно простым запросом –

Код:
SELECT * , SUM( `vote` ) AS `sum` , count( `vote` ) AS `CountVote` , SUM( `vote` ) / count( `vote` ) AS `rating` 
FROM `cms_rating`
WHERE `what` = '2306'

Этот запрос выполняется достаточно быстро, но меня смущает то, что сумма голосов и их количество подсчитываются дважды.
Так же если нужно подсчитать рейтинг более чем для одного товара, то такой запрос не срабатывает. Если в условие WHERE перечислить все нужные идентификаторы товара, то рейтинг посчитается только для первого из них. (WHERE `what` = '1' OR `what` = '2' OR `what` = 'n').
Собственно вот и вопросы, как избавиться от двойного подсчёта полей `sum` и `CountVote`, а также как вычислить рейтинг нескольких товаров в одном запросе.

Отправлен: 22.09.2009, 17:54
Вопрос задал: Cimus, Студент
Всего ответов: 3
Страница вопроса »


Отвечает vladisslav, 5-й класс :
Здравствуйте, Cimus!
Чтобы избежать двойного вычисления, нужно использовать переменные. Чтобы посчитать для нескольких товаров (или всех), нужно использовать группировку.

Приложение:

Ответ отправил: vladisslav, 5-й класс
Ответ отправлен: 22.09.2009, 18:32

Оценка ответа: 5
Комментарий к оценке:
Спасибо!

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254529 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает Victor Pyrlik, Модератор :
    Здравствуйте, Cimus.

    SELECT what, SUM(vote) AS sum_vote , count(vote) AS count_vote , AVG( vote ) AS avg_vote
    FROM cms_rating
    WHERE what = '2306'
    GROUP BY what

    или, для множества
    WHERE what IN (2306,2307,2308 и т.д.)

    URL >>ОБОБЩЕНИЕ ДАННЫХ С ПОМОЩЬЮ АГРЕГАТНЫХ ФУНКЦИЙ

    -----
    Жизнь игрушка – пока играешь сам..

    Ответ отправил: Victor Pyrlik, Модератор
    Ответ отправлен: 22.09.2009, 19:02
    Россия, Екатеринбург
    Тел.: 89043822027
    ICQ # 490191733
    Абонент Skype: stells00

    Оценка ответа: 5
    Комментарий к оценке:
    Спасибо за отличный ответ и за ссылку!

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254532 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!
    Отвечает leonid59, 8-й класс :
    Здравствуйте, Cimus.

    select
    what,
    count(vote) as CountVote,
    sum(vote) as SumVote,
    avg(vote) as rating
    from cms_rating
    group by what

    Использовать слова типа 'sum' (в апострофах) очень не советую, хотя работать-то будет, но за этим словом закреплен и зарезервированный смысл. Остальные имена не являются зарезервированными и сформированы по всем правилам имен SQL, поэтому (и в Мануале, кстати) они используются без апострофов

    Ответ отправил: leonid59, 8-й класс
    Ответ отправлен: 22.09.2009, 20:01

    Оценка ответа: 5
    Комментарий к оценке:
    Спасибо!

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 254542 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.9 от 25.09.2009

    В избранное