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

ee7vknir  于 2022-12-03  发布在  Mysql
关注(0)|答案(5)|浏览(152)

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

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

但是这样不行,问题是我在查询之前不知道记录的数量,有什么办法吗?

zazmityj

zazmityj1#

我找到的最佳答案:

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

fslejnso

fslejnso2#

如果你这样做是为了一个无序的,或随机的情况-我已经开始使用以下风格:

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

时间复杂度O(n),O(n +1),O(n +1),O(n +1)

drkbr07n

drkbr07n3#

你也可以试试看:

SET @amount =(SELECT COUNT(*) FROM page) /10;
PREPARE STMT FROM 'SELECT * FROM page LIMIT ?';
EXECUTE STMT USING @amount;

这是一个MySQL错误,在这里描述:http://bugs.mysql.com/bug.php?id=19795
希望能帮上忙。

xkftehaa

xkftehaa4#

我知道这是非常旧的,但它仍然弹出作为顶部结果当你谷歌SQL限制的百分比,所以我会尽量保存你一些时间。这是很简单的做这些天。下面将给予OP他们需要的结果:

SELECT TOP 10 PERCENT
    id, 
    value 
    FROM list
    ORDER BY value DESC

要快速随机获取表中的10%,以下代码就足够了:

SELECT TOP 10 PERCENT
    id, 
    value 
    FROM list
    ORDER BY NEWID()
vsmadaxz

vsmadaxz5#

我有一个在其他答案中没有提到的替代方案:如果您从任何一种语言访问,而您可以完全访问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_store_result(),不适用于mysql_use_result(),因为后者要求您始终接受所有需要的行。
OTOH,我的解决方案的通信量可能太高-必须传输所有行。

相关问题