2016-02-26 2 views
0

Я храню оценки для позиции в таблице, которая называется ratings.Подсчитайте количество строк с определенными значениями

value - целое число от 0 до 7 (номинальное значение).

В качестве примера, предположим, что showcase_id = 1 имеет 10 Всего оценок:

  • 5 оценок являются значение = 7
  • 2 рейтинги значение = 6
  • 2 рейтинги значение = 5
  • 1 номинал = 4
  • нет оценок для значений 0,1,2,3

Есть ли эффективный способ, я могу выбрать общее количество оценок для каждого конкретного значения, общее количество оценок и средний рейтинг от одного запроса?

например. число строк/счет WHERE value = 6 равно 2. Нужно ли мне делать 7 отдельных подзапросов?

SELECT AVG(value),COUNT(*),???? 
FROM ratings 
WHERE showcase_id = :showcase_id 

ответ

0

Вы имеете в виду count(distinct)?

SELECT AVG(value), COUNT(*), COUNT(DISTINCT value) 
FROM ratings 
WHERE showcase_id = :showcase_id; 

EDIT:

Если вы хотите, общее для каждого значения, вы можете запихнуть это в один столбец, используя подзапрос:

SELECT SUM(cnt * value)/SUM(cnt) as average, 
     SUM(cnt) as total_cnt, 
     GROUP_CONCAT(value, '-', cnt ORDER BY VALUE) as values 
FROM (SELECT value, COUNT(*) as cnt 
     FROM ratings r 
     WHERE showcase_id = :showcase_id 
     GROUP BY value 
    ) r; 

Возможно подзапрос отвечает вашим потребностям, а также.

+0

Это считается, сколько значений различны, но мне нужно, чтобы подсчитать, сколько оценок были даны для каждого конкретного значения – frosty

+0

Ваша правка, дает ошибку 'У вас ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии сервера MariaDB, для правильного синтаксиса для использования рядом с значениями FROM (значение SELECT, COUNT (*) as cnt, COUNT (значение DISTINCT) FROM r 'в строке 3' – frosty

+0

@frosty. Ооо, я оставил в подзапросе 'COUNT (DISTINCT)'. –

0

Что не так с группой?

SELECT AVG(value),COUNT(*), value 
FROM ratings 
WHERE showcase_id = :showcase_id 
GROUP BY value; 

EDIT (с общим срд & тотализаторов):

select count(*) total_by_value, value, s1.full_avg, s1.full_total 
from ratings r, 
(select avg(value) full_avg, count(*) full_total from ratings) s1 
group by s1.full_avg, s1.full_total, value; 
+0

Хорошо, что подсчитывает, сколько для каждого конкретного значения, но не учитывает общее количество рейтингов и общее среднее значение.По крайней мере, из того, что я вижу .. – frosty

+0

Вам также нужно добавить 'count (*)' в подзапрос 's1', чтобы получить общее количество оценок. – Barmar

+0

@Barmar, tru dat –

0

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

SELECT value, AVG(value) AS avg, COUNT(*) as count 
FROM ratings 
WHERE showcase_id = 1 
GROUP BY value WITH ROLLUP 

Это даст строку для каждого значения с его счета, а затем строка с value = NULL для агрегатов, что весь результат.

DEMO

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