Быстрое исправление некоторых ответов выше. Я полагаю, что OP ищет AVG () вместо SUM (), поскольку может быть 1000 голосов с 1 значением и 100 с 5, так что для получения высшего рейтинга вам понадобится AVG. Чтобы получить "рейтинг наиболее часто", вы должны сделать COUNT (). Сама SUM () сама по себе мало что говорит. 200x5 = 1000x1 = 300x3 + 100x1
Если вы измените st_date на timestamp, вы также можете использовать timestampdiff в дополнение к другим функциям даты, упомянутым в других решениях. Измените ДЕНЬ на МЕСЯЦ или ГОД и на <7 на <1 для месяца / года или просто оставьте как дни и сделайте 30/365 </p>
$query = "SELECT stories.*, AVG(votes.vote_value) as 'total_votes'
FROM stories JOIN votes ON stories.id = votes.item_name
WHERE abs(timestampdiff(DAY, stories.st_date, NOW())) < 7
GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
Кроме того, приведенный выше запрос дает вам статьи с самым высоким рейтингом, которые были созданы за желаемый период. Если вы решили просмотреть статьи с наивысшим рейтингом в течение периода, НЕТ МАТЕРИИ, когда они были созданы, измените положение where в соответствии с датой голосования
$query = "SELECT stories.*, AVG(votes.vote_value) as 'total_votes'
FROM stories JOIN votes ON stories.id = votes.item_name
WHERE abs(timestampdiff(DAY, votes.date, NOW())) < 7
GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
Вы можете объединить создание статьи и период голосования в одном запросе.
И последнее, но не менее важное: вы должны изменить имя столбца 'date' на что-то другое, например voice_date. Дата является зарезервированным словом, и не рекомендуется использовать его для имени столбца