MySQL:我需要每天显示每个用户从 1 到最多 n 个帖子

标签 mysql sql

我有一张包含用户帖子的表格。我需要每天显示每个用户的 1 到最多 n 个帖子。

例子:

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

我需要一个查询,例如,每个用户每天最多返回 2 个帖子:

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

我尝试使用 GROUP 和 HAVING,但我只获得前 n 条记录,而不是每个用户每天的前 n 条记录:

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

最佳答案

试试这个糟糕的 SQL 代码 :)

select post_id, user_id, post_datetime, post_text from (
  select posts.*,
    if (user_id = @prev_user and date(post_datetime) = date(@prev_day),
      @row := @row + 1, @row := 1) idx,
    @prev_user := user_id,
    @prev_day := post_datetime
  from posts, (select @row := 1, @prev_user := null, @prev_day := null) init
  order by date(post_datetime), user_id, post_datetime desc
) s
where s.idx <= 2

结果:

+---------+---------+---------------------------------+----------------+
| POST_ID | USER_ID |          POST_DATETIME          |   POST_TEXT    |
+---------+---------+---------------------------------+----------------+
|       4 |     100 | December, 01 2012 04:00:00+0000 | lorem ipsum 4  |
|       2 |     100 | December, 01 2012 02:00:00+0000 | lorem ipsum 2  |
|       3 |     101 | December, 01 2012 03:00:00+0000 | lorem ipsum 3  |
|       5 |     102 | December, 01 2012 05:00:00+0000 | lorem ipsum 5  |
|       6 |     100 | December, 02 2012 03:00:00+0000 | lorem ipsum 6  |
|      10 |     101 | December, 02 2012 07:00:00+0000 | lorem ipsum 10 |
|       9 |     101 | December, 02 2012 06:00:00+0000 | lorem ipsum 9  |
|       7 |     102 | December, 02 2012 04:00:00+0000 | lorem ipsum 7  |
+---------+---------+---------------------------------+----------------+

fiddle here .

我认为如果按日期降序排列会更合适,因为您实际上得到的是最接近当前日期的前 2 个。

关于MySQL:我需要每天显示每个用户从 1 到最多 n 个帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811878/

相关文章:

sql - 如何在Powershell中遍历数据表?

PHP MySQL : Take highest values from multiple categories and write an array?

sql - MYSQL SELECT WITHIN IF 语句

mysql - 表内的 SQL 分组

mysql查找表加入其他3个表,有没有更好的方法?

java.sql.SQLException : Fail to convert to internal representation Exception 异常

mysql - sql基于ANDing多个详细记录选择主记录

php - 今天、昨天、每月日志的 MySQL 表设置

mysql - 从表中选择与其他表记录匹配的行

mysql - 如何在仍然利用索引的同时在两列之间进行查询?