Каков наилучший способ реализовать сортировку по времени в php / mysql? - PullRequest
1 голос
/ 11 апреля 2009

У меня есть 1 таблица, заполненная статьями. Для целей этого поста, давайте просто скажем, что он имеет 4 поля. story_id, story_title, story_numyes, story_numno

Каждая статья может быть оценена как ДА или НЕТ. Я храню каждый рейтинг в другой таблице, которая содержит 3 поля: Vote_storyid, Vote_date (в качестве временной метки), voice_code (1 = да, 0 = нет).

Поэтому, когда кто-то голосует «за» над статьей, он запускает запрос на обновление к story_numyes + 1, а также запрос на вставку, чтобы записать идентификатор истории, дату и код голосования в 2-й таблице.

Я бы хотел отсортировать статьи по количеству проголосовавших ДА или НЕТ. Для рейтинга «Лучшее за все время» очевидно просто .... ORDER BY story_numyes DESC.

Но как мне поступить с лучшими / худшими статьями сегодня, на этой неделе, в этом месяце?

Я получаю метки времени, чтобы отмечать даты отсечения для каждого периода с помощью следующего:

$yesterday= strtotime("yesterday");
$last_week = strtotime("last week");
$last_month = strtotime("last month");

Но я не уверен, как использовать эти временные метки в запросе mysql для достижения желаемых результатов.

Ответы [ 3 ]

3 голосов
/ 11 апреля 2009

Попробуйте что-то вроде

SELECT id,
СУММА (СЛУЧАЙ, КОГДА ГОЛОСОВАЛСЯ> = $ вчера, ТОГДА 1, ДРУГОЙ 0 КОНЕЦ) КАК ДЕНЬ,
СУММА (СЛУЧАЙ, КОГДА ГОЛОСОВАННЫЙ> = $ last_week THEN 1 ELSE 0 END) КАК неделя,
SUM (1) AS месячный счет
ОТ голоса
ГДЕ yes_no = 'ДА'
И проголосовал> = $ last_month
GROUP BY id

Затем сделайте это подзапросом, и вы сможете получить максимальные значения для количества.

(Пожалуйста, учтите обычную синтаксическую неровность, присущую непроверенному запросу.)


В ответ на комментарии:

Чтобы использовать его как эффективный подзапрос (т.е. не коррелировать), чтобы получить максимальные значения:

SELECT
MAX (количество дней) AS MaxDayCount,
MAX (неделя) AS MaxWeekCount,
MAX (месячный счет) AS MaxMonthCount
ОТ
(
.... все эти вещи ...
) КАК qcounts

но, конечно, вы не можете отнести их к идентификаторам, потому что они разные. Если вы хотите, чтобы они по одному с идентификаторами, вы могли бы

SELECT id, счет месяца
ОТ
(
.... все эти вещи ...
) КАК qcounts
ЗАКАЗАТЬ ПО МЕСЯЦУ LIMIT 1

и сделайте это три раза, один раз за день / неделю / месяц.

Примечание: это все, чтобы проиллюстрировать некоторые вещи, которые вы могли бы выполнить в одном достаточно эффективном запросе. Я не удивлюсь, если вы обнаружите, что проще всего (и просто == хорошо) разбить его, как предлагают другие.

2 голосов
/ 11 апреля 2009

В целом:

select story_id, sum(vote_code)
from story_vote
group by story_id;

Для определенных диапазонов дат голосования:

select story_id, sum(vote_code)
from story_vote
where vote_date >= 'least date, inclusive' 
and vote_date < 'last date, exclusive'
group by story_id;

OP комментарии:

Как бы я использовал предложение ORDER BY?

Вы бы добавили order by sum(vote_code). По убыванию, если вы хотите сначала истории с наибольшим количеством голосов:

order by sum(vote_code) desc;

При редактировании: я заметил, что он хочет все истории, а не одну, поэтому я убираю предложение о наличии.

0 голосов
/ 11 апреля 2009
SELECT a.*, SUM(vote_code) AS votes
FROM articles a JOIN votes v ON (a.story_id = v.vote_storyid)
WHERE v.vote_date >= $yesterday
GROUP BY a.story_id
ORDER BY 2 DESC;

Аналогично для $last_week и $last_month.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...