假设我有一个值列表,如下所示:
id value
----------
A 53
B 23
C 12
D 72
E 21
F 16
..
Run Code Online (Sandbox Code Playgroud)
我需要这个列表的前10 % - 我试过:
SELECT id, value
FROM list
ORDER BY value DESC
LIMIT COUNT(*) / 10
Run Code Online (Sandbox Code Playgroud)
但这不起作用.问题是我在查询之前不知道记录的数量.有任何想法吗?
Dyl*_*lan 13
我找到的最佳答案:
SELECT*
FROM (
SELECT list.*, @counter := @counter +1 AS counter
FROM (select @counter:=0) AS initvar, list
ORDER BY value DESC
) AS X
where counter <= (10/100 * @counter);
ORDER BY value DESC
Run Code Online (Sandbox Code Playgroud)
更改10以获得不同的百分比.
如果您是为了无序或随机情况执行此操作 - 我已开始使用以下样式:
SELECT id, value FROM list HAVING RAND() > 0.9
Run Code Online (Sandbox Code Playgroud)
如果您需要它是随机但可控的,您可以使用种子(例如 PHP):
SELECT id, value FROM list HAVING RAND($seed) > 0.9
Run Code Online (Sandbox Code Playgroud)
最后 - 如果这是一种您需要完全控制的事情,您实际上可以在插入行时添加一个包含随机值的列,然后使用该列进行查询
SELECT id, value FROM list HAVING `rand_column` BETWEEN 0.8 AND 0.9
Run Code Online (Sandbox Code Playgroud)
由于这不需要排序,或者ORDER BY- 它是 O(n) 而不是 O(n lg n)