#mysql #sql
#mysql #sql
Вопрос:
В моей posts
таблице сохраняется временная метка для каждой записи post.
Какой запрос может группировать сообщения по дням, используя этот столбец метки времени?
Ответ №1:
Как насчет этого? Используя DATE
функцию:
SELECT DATE(FROM_UNIXTIME(MyTimestamp)) AS ForDate,
COUNT(*) AS NumPosts
FROM MyPostsTable
GROUP BY DATE(FROM_UNIXTIME(MyTimestamp))
ORDER BY ForDate
Это покажет вам количество сообщений на каждую дату, для которых в таблице есть данные.
Комментарии:
1. Я нашел свой ответ, но ваш ответ неверен, он возвращает null, правильным является :
DATE(FROM_UNIXTIME(timestamp))
2. @p.campbell : как можно ограничить количество строк для каждой даты? пример: для
2011-05-11
меня есть 10 сообщений и для2011-05-12
20 сообщений, я хочу показать2 post
для каждой даты, вы можете мне помочь?3. Как бы вы хотели решить, какие 2 показывать? В начале дня, или в конце дня, или большинство просмотров, или другое? Любезно предполагаю, что это совершенно новый вопрос в целом. Если вы опубликуете это, скорее всего, вы быстро получите отличный ответ!
4. @Dems: хорошо, я жду вашего ответа.
5. @p.campbell: нет, это состоит из этого вопроса, я хочу просто показать 2 последних сообщения в каждую дату
Ответ №2:
SELECT DATE(timestamp) AS ForDate,
COUNT(*) AS NumPosts
FROM user_messages
GROUP BY DATE(timestamp)
ORDER BY ForDate
Это нашлось для меня. У меня есть временная метка типа «2013-03-27 15: 46: 08».
Комментарии:
1. Это работало в MySQL 5.1.52. ДАТА (ИЗ_UNIXTIME(MyTimestamp)) в предыдущем ответе вернула значение null.
Ответ №3:
SELECT
*
FROM
(
SELECT DATE(FROM_UNIXTIME(MyTimestamp)) AS ForDate,
ROW_NUMBER() OVER (PARTITION BY DATE(FROM_UNIXTIME(MyTimestamp)) ORDER BY MyTimeStamp) AS PostRowID,
*
FROM MyPostsTable
)
AS sequenced_daily_posts
WHERE
ForDate = <whatever date(s) you want>
AND PostRowID <= 2
Комментарии:
1. Спасибо, но смотрите мой последний комментарий:
i want just show 2 of last posts in each date
я думаю, что этот запрос показывает только сообщения, у которых на дату этого есть 2 сообщения2. Я протестировал Ваш запрос, и он вернул синтаксическую ошибку в
(PARTITION BY DATE(FROM_UNIXTIME(MyTimestamp)))
3. Если в день есть 1 сообщение, в нем будет отображаться одно сообщение за этот день. Если в день есть 2 публикации, то будут показаны обе публикации за этот день. Если за день будет 3 или более сообщений, будут показаны только первые 2 сообщения за этот день. (Добавьте DESC к ЗАКАЗУ ПО, чтобы в нем отображались последние два сообщения каждого дня.) Это ограничение в 2 в день не имеет никакого отношения к тому, есть ли у вас сто дней, в общей сложности до 200 возвращенных записей.
4. Синтаксическая ошибка связана с дополнительным), который был удален при редактировании. Вы, должно быть, скопировали до того, как я заметил.
5. О, и, по-видимому, MySQL не поддерживает оконную функцию ROW_NUMBER (), поэтому вы можете проигнорировать этот ответ. Извините.
Ответ №4:
Я провел много исследований по поводу этой ошибки и получил решение, согласно которому, если вы выбираете метку времени в пределах ДАТЫ, тогда вы должны использовать этот символ (`) до и после имени столбца.
select DATE(addedon) as addedon, count(*) from data where id= '$bid' GROUP BY DATE(addedon)