MySQL每个键获得n行

时间:2016-11-27 14:33:51

标签: mysql pdo

给出一个非常简单的表

ID | bit_id | timestamp | percent | delta

其中bitid是 varchar(255),时间戳是 bigint

有许多行具有相同的bit_id。 ID是主要的,时间戳不是唯一的。

使用以下SQL我获取特定bit_id集的行:

SELECT bits.bit_id, bits.timestamp, bits.percent 
FROM bits 
WHERE bits.bit_id IN ( '00e04c0353bc', '00e04c02c749' ) 
AND bits.timestamp>1480075040 
ORDER BY bits.timestamp DESC

我想要的只是与WHERE语句匹配的5个最新行每bit_id 。因此,对于子集中的每个给定的bit_id,我想要5个最新的行。

所以简单地添加LIMIT n就行不了。

如何?我的MySQL版本在子选择中不能与LIMIT一起使用。

1 个答案:

答案 0 :(得分:2)

如果您只有两个值,那么最简单的方法是union all

(SELECT b.bit_id, b.timestamp, b.percent 
 FROM bits b
 WHERE b.bit_id = '00e04c0353bc'
       b.timestamp > 1480075040 
 ORDER BY b.timestamp DESC
 LIMIT 5
) UNION ALL
(SELECT b.bit_id, b.timestamp, b.percent 
 FROM bits b
 WHERE b.bit_id = '00e04c02c749'
       b.timestamp > 1480075040 
 ORDER BY b.timestamp DESC
 LIMIT 5
);

我不确定WHERE上的timestamp条件是否有必要。

如果您想为更多bit_id或更多select b.* from (select b.*, (@rn := if(@b = bit_id, @rn + 1, if(@b = bit_id, 1, 1) ) ) as rn from bits b cross join (select @b := '', @rn := 0) params order by b.bit_id, b.timestamp desc ) b where rn <= 5; s或更长时间执行此操作,那么变量可能会更简单:

<div class="someclassintabscontainer">
<!-- Here the tabs code writed normaly -->
</div>