【问题标题】:MySQL Limit Rows / Group ByMySQL限制行/分组依据
【发布时间】:2015-11-08 17:12:25
【问题描述】:

我已经搜索了很多关于这个的不同帖子,但我没有找到适合我的东西。

Using LIMIT within GROUP BY to get N results per group?http://www.sqlines.com/mysql/how-to/get_top_n_each_group 对我不起作用。

我有一个包含以下列的简单 MySQL 表

id , package, user_id, date

我想执行一个查询,我将在其中得到 ​​p>

X Rows / user_id WHERE date > Number Order By date ASC

简而言之,我们希望使用LIMIT of X rows / group 执行Group By user_id,但请记住使用date column 的语句

全表示例

id , package, user_id, date
1,  full, 1 , 1447003159
2,  full, 1 , 1447003055
3,  full, 1 , 1447002022
4,  full, 1 , 1447001013
5,  full, 1 , 1447000031
6,  mid,  2 , 1447003159
7,  mid,  2 , 1447003055
8,  mid,  2 , 1447002022
9,  mid,  2 , 1447001013
10, mid,  2 , 1447000031

从上表中,我们只想选择 2 行 / user_id 但其中日期 >= 1447000031(但首先要选择 ORDER BY date ASC

预期输出

4,  full, 1 , 1447001013
3,  full, 1 , 1447002022
9,  mid,  2 , 1447001013
8,  mid,  2 , 1447002022

【问题讨论】:

  • 所以您希望每个用户拥有超过 1 行?
  • 示例表和结果请教
  • that date > Number?
  • 已编辑。希望现在很清楚

标签: mysql


【解决方案1】:

例如:

SELECT x.*
  FROM my_table x 
  JOIN my_table y 
    ON y.id >= x.id 
   AND y.user_id = x.user_id 
 WHERE y.date > 1447000031 
 GROUP 
    BY x.id 
HAVING COUNT(*) <= 2;

或者,更快,但更多的打字......

SELECT id
     , package
     , user_id
     , date 
  FROM 
     ( SELECT x.*
            , CASE WHEN @prev_user = user_id THEN @i:=@i+1 ELSE @i:=1 END rank
            , @prev_user := user_id 
         FROM my_table x
            , ( SELECT @prev_user = 0,@i:=1 ) vars 
        WHERE date > 1447000031
        ORDER 
           BY user_id
        , date
 ) a 
 WHERE rank <= 2;

【讨论】:

  • 另外,如果你可以格式化第二个解决方案,那么 WHERE rank
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 2011-02-08
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多