2014-11-01 6 views
2

Я хочу использовать SQL для получения 5 "лучших" профилей. Проблема в том, что я не хочу, чтобы рейтинг основывался только на оценках.SQL-сортировка по двум столбцам

Скажите, что есть профиль с оценкой 8.1, но с 5 отзывами Я хочу, чтобы профиль с оценками в 7,9 и 30 баллов оценивался выше.

Как я могу достичь этого, если оценка не более 0,3 ниже другой, но с оценкой выше 30% выше, чем другая?

Это мой запрос прямо сейчас: (среднее = оценка, обзор = число обзоров)

SELECT name,reviews,average 
FROM profiles 
WHERE average >= 7 
    AND reviews >= 50 
ORDER BY average DESC, reviews DESC 
LIMIT 5 
+0

Я бы подумал, что вы можете создать представление с вычисленным столбцом, например: 'Adjusted_Grade = Number_of_Reviews/10.0 + Raw_Grade' –

+0

Можете ли вы написать функцию ранжирования, которая принимает одну строку и генерирует значение доброты, которое правильно оценивает? Я не подозреваю; это, скорее всего, требует двух строк, а не одной строки. Тем не менее, это будет сложно. Кстати, оба ваших профили примера отклоняются условием фильтра в запросе. –

ответ

1

Вы можете сделать аналогичный расчет в пункте ORDER BY. Я буду продолжать пытаться выяснить, могу ли я получить ровно, что вы собираетесь делать, но чтобы начать, вы можете весить свою сортировку примерно так.

SELECT name,reviews,average 
FROM profiles 
WHERE average >= 7 
    AND reviews >= 50 
ORDER BY (average*.7 + reviews*.3) 
LIMIT 5 
+0

Предположительно это не сработает, потому что диапазон «отзывов» намного больше, чем диапазон среднего, поэтому он будет доминировать в расчете. –

0

Вы можете рассчитывать на лету фактического рейтинга профиля и рода тем.

Что-то вроде:

 
SELECT name,reviews,average, (reviews * average) AS rating 
FROM profiles 
WHERE average >= 7 
    AND reviews >= 50 
ORDER BY rating DESC 
LIMIT 5 

В приведенном выше примере вы можете заменить (reviews * average) с тем, что алгоритм вы хотите, чтобы вычислить рейтинг.

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

+1

В mysql вы не можете заказать псевдоним. Поэтому '(review * average)' должен быть выражен в 'ORDER BY'. – cyk

1

Хммм, я не уверен, как вы реализуете свое конкретное правило.

Часто, сталкиваясь с этой задачей, я часто вычитаю одну стандартную ошибку из оценочной стоимости обзоров. Это дает более низкую оценку рейтинга с некоторой степенью уверенности. В целом, чем больше отзывов, тем увереннее, тем ниже стандартное отклонение.

Это может быть легко вычислен, если вы знали, отдельные отзывы:

SELECT name, count(*) as numreviews, avg(reviews), 
     avg(review) - std(review)/sqrt(count(*)) as avg_lb 
FROM reviews r 
ORDER BY avg_lb DESC 
LIMIT 5; 

Если вы не собирание стандартного отклонения мнений индивида, то этот метод не будет работать.

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