I have one table with user posts. I need to show from 1 to maximum n post from each user per each day.
Example:
post_id|user_id|post_datetime|post_text
1 |100 |2012-12-01 01:00:00|lorem ipsum 1
2 |100 |2012-12-01 02:00:00|lorem ipsum 2
3 |101 |2012-12-01 03:00:00|lorem ipsum 3
4 |100 |2012-12-01 04:00:00|lorem ipsum 4
5 |102 |2012-12-01 05:00:00|lorem ipsum 5
6 |100 |2012-12-02 03:00:00|lorem ipsum 6
7 |102 |2012-12-02 04:00:00|lorem ipsum 7
8 |101 |2012-12-02 05:00:00|lorem ipsum 8
9 |101 |2012-12-02 06:00:00|lorem ipsum 9
10 |101 |2012-12-02 07:00:00|lorem ipsum 10
I need a query that returns, for instance, a maximumf of 2 posts per day for each user:
post_id|user_id|post_datetime|post_text
2 |100 |2012-12-01 02:00:00|lorem ipsum 2
4 |100 |2012-12-01 04:00:00|lorem ipsum 4
3 |101 |2012-12-01 03:00:00|lorem ipsum 3
5 |102 |2012-12-01 05:00:00|lorem ipsum 5
6 |100 |2012-12-02 03:00:00|lorem ipsum 6
7 |102 |2012-12-02 04:00:00|lorem ipsum 7
9 |101 |2012-12-02 06:00:00|lorem ipsum 9
10 |101 |2012-12-02 07:00:00|lorem ipsum 10
I tried with GROUP and HAVING but I only get the top n records, not the top n per day for each user:
SELECT a.* FROM posts AS a
JOIN posts AS a2
ON a.user_id = a2.user_id AND a.post_datetime <= a2.post_datetime
GROUP BY a.post_id
HAVING COUNT(*) <= 3
ORDER BY a.post_id, a.post_datetime DESC
Try this awful SQL code 🙂
Result:
Fiddle here.
I thought the ordering would be more suitable if it was descending by date, as you’re actually getting the top 2 closest to the current date.