MySQL:LIMIT占记录数量的百分比?

Dyl*_*lan 8 mysql sql

假设我有一个值列表,如下所示:

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以​​获得不同的百分比.


Mik*_*ail 5

如果您是为了无序或随机情况执行此操作 - 我已开始使用以下样式:

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)

  • 请注意,这些查询可以返回从无记录到所有记录的任何内容(这只是任何给定记录在结果集中的概率为 0.1)。 (4认同)