MYSQL - 查找每日3个最佳评分记录

时间:2016-08-17 08:56:11

标签: mysql sql

鉴于此MYSQL图像表,我希望每天获得最佳评分记录。

id    created_at             rateScore
--------------------------------------
1     2014-06-16 12:30:00    100
2     2014-06-16 13:30:00    200
3     2014-06-16 14:30:00    50    
4     2014-06-16 15:30:00    20  
5     2014-06-16 16:30:00    0  
6     2014-06-17 14:30:00    100  
7     2014-06-17 14:31:00    90  
8     2014-06-18 14:31:00    100 

预期结果: 每天只显示3个最佳评分图像。

id    created_at             rateScore
--------------------------------------
1     2014-06-16 12:30:00    100
2     2014-06-16 13:30:00    200
3     2014-06-16 14:30:00    50        
6     2014-06-17 14:30:00    100  
7     2014-06-17 14:31:00    90  
8     2014-06-18 14:31:00    100 

我尝试了很多子选择等,但我开始变得沮丧。问题似乎很容易,但对我来说很难解决。也许某人有提示如何解决这个问题。

提前致谢并度过愉快的一天

4 个答案:

答案 0 :(得分:0)

具有相关的子查询,该查询返回相同日期的分数较高的行数。如果小于3,请返回!

select * from tablename t1
where (select count(*) from tablename t2
       where DATE(t2.created_at) = DATE(t1.created_at)
         and t2.rateScore > t1.rateScore) < 3

注意:如果第三名是平局,则返回4行。 (例如,100,80,70,70。)

答案 1 :(得分:0)

请使用以下查询

select r.* from rate as r 
where r.created_at IN 
(select  group_concat(r1.id) from rate as r1 
where r1.created_at = r.created_at order by r1.rateScore 
desc limit 0,3 ) group by r.id

答案 2 :(得分:0)

MySQL缺乏分析功能,您正在寻找的功能。但是你可能会发现使用变量的workarround。类似的东西:

SELECT id,
       date,
       rateScore
  FROM (SELECT    t.id,
                  t.date,
                  t.rateScore,
                  @curRank :=  IF(date=@last_date, @curRank + 1, @curRank := 1) AS rank,
                  @last_date := date
        FROM      (SELECT * FROM table ORDER BY date) t, 
                  (SELECT @curRank := 0) r) aux
WHERE aux.rank <= 3

我还没有真正测试过这个查询,但你可能会得到一般的想法。

答案 3 :(得分:0)

您可以在 MySQL user defined variables

的帮助下取得成果
SELECT 
t.id,
t.created_at,
t.rateScore
FROM 
(
    SELECT 
    *,
    IF(@sameDate = DATE(created_at), @rn := @rn + 1,
       IF(@sameDate := DATE(created_at), @rn := 1, @rn := 1)
    ) AS row_number
    FROM your_table 
    CROSS JOIN (SELECT @sameDate := '0000-00-00', @rn := 1) var
    ORDER BY created_at,rateScore DESC 
) AS t
WHERE t.row_number <= 3
ORDER BY t.created_at, t.rateScore DESC

为了获得每天的X条目,只需更改此行(WHERE t.row_number <= 3),如下所示:

WHERE t.row_number <= X

注意:我想(created_at,rateScore)上的综合索引可以提升效果。

如果您没有,则可以创建和衡量性能变化:

ALTER TABLE `your_table` ADD INDEX `idx_table_creaed_at_rateScore` (
    `created_at`,
    `rateScore`
);