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。