2013-04-01 4 views
0

Может ли кто-нибудь помочь мне с таким типом запросов.MySQL: Каскадная фильтрация по датам

у меня есть:

  • posts стол
  • comments стол

Они связаны между собой через comments.post_id = posts.post_id колонн.

Я пользователь может фильтровать почту по комментариям к прошлому:

  • 1 час
  • 24 часа
  • 2 дня и т.д.

Если пользователь выбрал, чтобы показать сообщения для Прошло 1 час, но там нет сообщений в этот период, мы должны сделать шаг за шагом:

Выберите пост за прошлым 1 hour, если пустой - за прошлый 24 hours, если пустой - за прошлый 2 days, если пустой - с момента создания (без каких-либо условий).

Может ли кто-нибудь помочь мне построить такой запрос?

UPD

"Фильтровать сообщения от комментариев" означает сортировку по комментариям сосчитать.

Таким образом, цель - запрос «Показывать сообщения, отсортированные по количеству комментариев, оставленным в течение последних XXX часов».

И если выбрано "for the past hour", но нет записей с комментариями, оставленными в течение последних 1 часа, нам нужно получать сообщения с комментариями, оставленными в течение последних 24 часов (отсортировано по количеству комментариев) и так далее ,

Таблицы Структура

Сообщений:

  • POST_ID
  • название
  • содержание
  • DATE_ADDED

Комментарии

  • comment_id
  • содержание
  • POST_ID
  • DATE_ADDED

Так ссылка posts.post_id = comments.post_id.

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

posts.post_id | comments_count | posts.date_added | group 
---------------+----------------+------------------+---------------- 
      156 |    8 |  2013-04-02 | hour 
      154 |    3 |  2013-04-02 | hour 
      129 |    1 |  2013-03-10 | 24 hours 
      13 |    14 |  2013-02-18 | 48 hours 
      138 |    6 |  2013-03-29 | week 
      137 |    4 |  2013-03-29 | week 
      161 |    21 |  2013-04-11 | month 
      6 |    2 |  2013-01-24 | year 
      103 |    8 |  2013-03-02 | since inception 

Результаты отсортированы по:

  1. Начало списка является 2 сообщений, которые были комментируемые из-за прошедшего часа, и упорядочивается по комментариям.
  2. Далее мы размещаем сообщения, которые были прокомментированы из-за прошедшего дня.
  3. Далее - посты комментировали из-за последние 2 дня
  4. сообщений комментируемых из-за прошедшую неделю, и снова они должны быть упорядочены по комментариям подсчитывать
  5. За прошедший месяц
  6. За прошедший год
  7. В конце в этом списке нам нужно разместить статьи, которые были прокомментированы больше, чем год назад, и их также следует заказать по количеству комментариев.

Заранее спасибо.

+0

Я думаю, что ваше лучшее решение - обернуть каждый запрос в 'if()' statement. Если количество записей равно 0, выполните следующий запрос. –

+0

, но интервалы фильтров хранятся в другой таблице, поэтому администратор может увеличить количество интервалов. Например. он может создать еще один фильтр «на прошлой неделе». Поэтому в этом случае нам нужно каждый раз изменять запрос, когда фильтры меняют –

+0

, если он может создать новый фильтр, а затем просто запрограммировать запрос, содержащий все возможные диапазоны дат. –

ответ

1

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

select p.* c.* 
from posts p join 
    comments c 
    on p.post_id = posts.post_id join 
    (select post_id, max(postdate) as postdate 
     from comments 
     group by post_id 
    ) cmax 
    on cmax.post_id = p.post_id 
where (case when timestampdiff(minute, now(), cmax.timestamp) <= 60 
      then timestampdiff(minute, now(), c.timestamp) <= 60 
      when timestampdiff(minute, now(), cmax.timestamp) <= 60*24 
      then timestampdiff(minute, now(), c.timestamp) <= 60*24 
      . . . 
    ) 

Синтаксис для сравнения времени зависит от того, является ли значения сохраняются как временные метки или DateTimes.

0

Если вы хотите топ 5 сообщений в течение последнего часа, предполагая, что ваши DATE_ADDED поля метки времени, вы можете использовать:

SELECT post_id, 
     count(comment_id) as comments_count, 
     posts.date_added, 'hour' as grouptime 
FROM  posts 
INNER JOIN comments 
ON  posts.post_id = comments.post_id 
WHERE TIMESTAMPDIFF(HOUR, comments.date_added, NOW()) = 0 
GROUP BY posts.post_id 
ORDER BY count(comment_id) DESC 
LIMIT 5 

Если вы хотите, чтобы все из них, просто удалите LIMIT. За последние 24 часа:

SELECT post_id, 
     count(comment_id) as comments_count, 
     posts.date_added, '24 hours' as grouptime 
FROM  posts 
INNER JOIN comments 
ON  posts.post_id = comments.post_id 
WHERE TIMESTAMPDIFF(HOUR, comments.date_added, NOW()) < 24 
GROUP BY posts.post_id 
ORDER BY count(comment_id) DESC 
LIMIT 5 

и т. Д. Для разных периодов времени.

Если вы хотите получить их все за один раз, используйте UNION между этими запросами.

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