鉴于此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
我尝试了很多子选择等,但我开始变得沮丧。问题似乎很容易,但对我来说很难解决。也许某人有提示如何解决这个问题。
提前致谢并度过愉快的一天
答案 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`
);