Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:限制记录数量的百分比?_Mysql_Sql - Fatal编程技术网

MySQL:限制记录数量的百分比?

MySQL:限制记录数量的百分比?,mysql,sql,Mysql,Sql,假设我有一个值列表,如下所示: id value ---------- A 53 B 23 C 12 D 72 E 21 F 16 .. 我需要这个列表的前10%——我尝试过: SELECT id, value FROM list ORDER BY value DESC LIMIT COUNT(*) / 10 但这不起作用。问题是我在查询之前不知道记录的数量。有什么想法吗?你也可以试试: SET @amount =(SELECT COUNT(*)

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

id  value
----------
A   53
B   23
C   12
D   72
E   21
F   16
..
我需要这个列表的前10%——我尝试过:

  SELECT id, value 
    FROM list
ORDER BY value DESC
   LIMIT COUNT(*) / 10

但这不起作用。问题是我在查询之前不知道记录的数量。有什么想法吗?

你也可以试试:

SET @amount =(SELECT COUNT(*) FROM page) /10;
PREPARE STMT FROM 'SELECT * FROM page LIMIT ?';
EXECUTE STMT USING @amount;
这是这里描述的MySQL错误:

希望能有所帮助。

我找到的最佳答案是:

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

更改10以获得不同的百分比。

我有一个在其他答案中没有提到的替代方法:如果您从任何可以完全访问MySQL API的语言(即不是MySQL CLI)进行访问,您可以启动查询,询问将有多少行,然后在需要时中断循环

例如,在Python中:

...
maxnum = cursor.execute(query)
for num, row in enumerate(query)
    if num > .1 * maxnum: # Here I break the loop if I got 10% of the rows.
        break
    do_stuff...
这只适用于mysql\u store\u result,而不适用于mysql\u use\u result,因为后者要求您始终接受所有需要的行


OTOH,我的解决方案的流量可能太高-所有行都必须传输。

如果您这样做是为了处理无序或随机情况-我已开始使用以下样式:

SELECT id, value FROM list HAVING RAND() > 0.9
如果您需要它是随机但可控的,您可以使用PHP的种子示例:

SELECT id, value FROM list HAVING RAND($seed) > 0.9
最后—如果这是一种需要完全控制的事情,那么实际上可以添加一个列,在插入行时保存一个随机值,然后使用该列进行查询

SELECT id, value FROM list HAVING `rand_column` BETWEEN 0.8 AND 0.9

因为这不需要排序,也不需要按顺序排序-它是打开的,而不是在lg n上

可能重复来自DUP的最佳答案的可能重复:@Tomalak:thanx,这看起来很棒!请注意,这些查询可能会从没有记录返回到所有记录,只是结果集中任何给定记录的概率为0.1。