2013-10-27 7 views
0

Прежде всего, я просто предупреждаю всех, что я что-то новичок в MySQL. Кроме того, я не тестировал примерные запросы ниже, чтобы они не были идеальными.MySQL - Получить строку и среднее количество строк

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

До сих пор я просто был захватывая верхний элемент с

SELECT * FROM items_table ORDER BY score DESC LIMIT 1 

Единственная проблема с этим состоит в том, что некоторые категории являются предвзятыми и как правило, имеют более высокие баллы. Я бы хотел решить это, сортируя по шкале, деленной на средний балл, а не просто сортируя по партитуре. Что-то вроде

ORDER BY score/(GREATEST(5,averageScore)) 

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

SELECT * FROM items_table, categories_table WHERE items_table.category = categories_table.category ORDER BY items_table.score/(GREATEST(5,categories_table.averageScore)) DESC LIMIT 1 

, но это чувствует себя грязным. Я знаю, что могу найти все средние, используя что-то вроде

SELECT AVG(score) FROM items_table GROUP BY category 

Что мне интересно, если есть какой-то способ, чтобы получить средние значения прямо в одном запросе.

Спасибо,

YM

+0

«Я что-то новобранец с MySQL», что вы имеете в виду новобранец? – Imran

+1

@imran: https://www.google.co.uk/search?q=define%3Arookie – eggyal

+0

Я использую его около 3 лет, но я сам преподаю и только узнал о нормализованных базах данных около 6 месяцев назад , –

ответ

1

Вы можете присоединиться запрос, который вычисляет средние значения:

SELECT i.* 
FROM  items_table i JOIN (
      SELECT category, AVG(score) AS averageScore 
      FROM  items_table 
      GROUP BY category 
     ) t USING (category) 
ORDER BY i.score/GREATEST(5, t.averageScore) DESC 
LIMIT 1 
+0

Выглядит отлично, я проведу его в своем собственном коде через несколько часов. –

+0

Не просто прекрасно выглядел, работал отлично. Большое спасибо! –

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