给出一个非常简单的表位:
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一起使用。
答案 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>