如何在纯SQL中请求随机行(或尽可能接近真正的随机)?


当前回答

 SELECT * FROM table ORDER BY RAND() LIMIT 1

其他回答

如果可能的话,使用存储语句来避免RND()上的索引和创建记录编号字段的效率低下。

PREPARE RandomRecord FROM "SELECT * FROM table LIMIT ?,1";
SET @n=FLOOR(RAND()*(SELECT COUNT(*) FROM table));
EXECUTE RandomRecord USING @n;
ORDER BY NEWID()

耗时7.4毫秒

WHERE num_value >= RAND() * (SELECT MAX(num_value) FROM table)

只需要0.0065毫秒!

我肯定会选择后一种方法。

sql中的随机函数可能会有所帮助。此外,如果您想限制为一行,只需在最后添加它。

SELECT column FROM table
ORDER BY RAND()
LIMIT 1

我不知道这有多有效,但我以前用过:

SELECT TOP 1 * FROM MyTable ORDER BY newid()

因为guid是非常随机的,所以顺序意味着您得到的是随机行。

你没说你用的是哪台服务器。在旧版本的SQL Server中,你可以使用这个:

select top 1 * from mytable order by newid()

在SQL Server 2005及以上版本中,你可以使用TABLESAMPLE来获取一个可重复的随机样本:

SELECT FirstName, LastName
FROM Contact 
TABLESAMPLE (1 ROWS) ;