假设我有一个值的列表,就像这样:
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
但这并不起作用。问题在于在执行查询之前我不知道记录的数量。有任何想法吗?
假设我有一个值的列表,就像这样:
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
但这并不起作用。问题在于在执行查询之前我不知道记录的数量。有任何想法吗?
我找到的最佳答案:
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更改为其他数字以获取不同的百分比。
如果你是在处理乱序或随机情况,我开始采用以下样式:
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
由于此操作不需要排序或ORDER BY
,因此时间复杂度为O(n)而不是O(n lg n)
SET @amount =(SELECT COUNT(*) FROM page) /10;
PREPARE STMT FROM 'SELECT * FROM page LIMIT ?';
EXECUTE STMT USING @amount;
我知道这篇文章很古老,但是当你在谷歌搜索"SQL按百分比限制"的时候,它仍然会显示在顶部结果中,所以我想让你节省些时间。现如今,这很容易实现。以下内容可以帮助作者获取他们所需的结果:
SELECT TOP 10 PERCENT
id,
value
FROM list
ORDER BY value DESC
SELECT TOP 10 PERCENT
id,
value
FROM list
ORDER BY NEWID()
...
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()
,因为后者要求您始终接受所有所需的行。
另一方面,我的解决方案的流量可能太高了 - 所有行都必须传输。