Как выбрать информацию из базы данных за день, неделю, месяц, год? - PullRequest
0 голосов
/ 30 ноября 2011

В настоящее время я получаю «статьи с самым высоким рейтингом», суммируя значения голосов из таблицы «голоса» против статей из таблицы «истории».

Текущий запрос PHP:

$sql = mysql_query("SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10") or die (mysql_error("There was an error in connection"));

Структура базы данных:

таблица историй:

img1

таблица голосов:

img2


Но я хотел бы знать, как отображать информацию в разные периоды времени.Скажем, показать лучшие по рейтингу статьи "сегодня" "на прошлой неделе" "в прошлом месяце" "в прошлом году".На основании даты создания статьи st_date из таблицы «историй».Мне просто нужны 4 (сегодня, на прошлой неделе, месяц, год) разные запросы или части, которые отвечают за получение данных в разные периоды времени.

Ответы [ 3 ]

1 голос
/ 30 ноября 2011
$date1 = "TO_DAYS(NOW()) - TO_DAYS(stories.st_date) = 0";
$date2 = "TO_DAYS(NOW()) - TO_DAYS(stories.st_date) <= 7";
$date3 = "TO_DAYS(NOW()) - TO_DAYS(stories.st_date) <= 31";
$date4 = "TO_DAYS(NOW()) - TO_DAYS(stories.st_date) <= 365";

$query = "SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name WHERE ".$date1." GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
$query = "SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name WHERE ".$date2." GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
$query = "SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name WHERE ".$date3." GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
$query = "SELECT stories.*, SUM(votes.vote_value) as 'total_votes' FROM stories JOIN votes ON stories.id = votes.item_name WHERE ".$date4." GROUP BY stories.id ORDER BY total_votes DESC LIMIT 10"
1 голос
/ 30 ноября 2011

Быстрое исправление некоторых ответов выше. Я полагаю, что 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. Дата является зарезервированным словом, и не рекомендуется использовать его для имени столбца

1 голос
/ 30 ноября 2011
SELECT stories.*, SUM(votes.vote_value) as 'total_votes' 
FROM stories 
JOIN votes 
   ON stories.id = votes.item_name 
WHERE (
       (st_date BETWEEN (NOW(), DATE_SUB(NOW(), INTERVAL 7 DAY))
       OR
       (st_date BETWEEN (DATE_SUB(NOW(), INTERVAL 14 DAY, DATE_SUB(NOW(), INTERVAL 7 DAY))
      )
GROUP BY stories.id 
ORDER BY total_votes DESC LIMIT 10") 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...