MySQL选择随机行
简介:在本教程中,您将学习各种技术以从MySQL的数据库表中选择随机行。
有时,您必须从表中选择随机行,例如:
在博客中选择一些随机帖子,然后在边栏中显示它们。
选择一个随机报价以显示"每日报价"小部件。
在图库中选择随机图片并用作特色图片。
MySQL使用ORDER BY RAND()选择随机行
MySQL没有任何内置语句可从表中选择随机行。
为此,您可以使用RAND()函数。
以下查询从数据库表中选择一个随机行:
SELECT * FROM table_name ORDER BY RAND() LIMIT 1;
让我们更详细地检查查询。
函数RAND()为表中的每一行生成一个随机值。
ORDER BY子句按RAND()函数生成的随机数对表中的所有行进行排序。
LIMIT子句选择结果集中随机排序的第一行。
如果要从数据库表中选择N条随机行,则需要如下更改LIMIT子句:
SELECT * FROM table_name ORDER BY RAND() LIMIT N;
请参阅示例数据库中的以下客户表。
以下示例从客户表中选择五个随机客户:
SELECT customerNumber, customerName FROM customers ORDER BY RAND() LIMIT 5;
请注意,您可能会得到不同的结果集,因为它是随机的。
这种技术在一张小桌子上效果很好。
但是,对于大表来说,这样做会很慢,因为MySQL必须对整个表进行排序以选择随机表。
查询的速度还取决于表中的行数。
表中的行越多,为每一行生成随机数所花费的时间就越多。
MySQL使用INNER JOIN子句选择随机行
此技术要求表具有一个自动递增的主键字段,并且序列中没有间隙。
以下查询根据主键列生成一个随机数:
SELECT ROUND(RAND() * ( SELECT MAX(id) FROM table_name)) AS id;
我们可以将表与上述查询返回的结果集连接起来,如下所示:
SELECT t.* FROM table_name AS t INNER JOIN (SELECT ROUND( RAND() * (SELECT MAX(id) FROM table_NAME )) AS id ) AS x WHERE t.id >= x.id LIMIT 1;
使用此技术,您必须多次执行查询才能获得一个以上的随机行,因为如果您增加限制,查询将只为您提供从随机选择的行开始的顺序行。
以下查询从客户表返回一个随机客户。
SELECT t.customerNumber, t.customerName FROM customers AS t JOIN (SELECT ROUND(RAND() * (SELECT MAX(customerNumber) FROM customers)) AS customerNumber ) AS x WHERE t.customerNumber >= x.customerNumber LIMIT 1;
MySQL使用变量选择随机行
如果表的id列的值在1..N范围内,并且该范围内没有间隔,则可以使用以下技术:
首先,选择1..N范围内的随机数。
其次,根据随机数选择记录。
以下语句可帮助您完成此操作:
SELECT table. * FROM (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table)) random_num, @num:=@num + 1 FROM (SELECT @num:=0) AS a, table LIMIT N) AS b, table AS t WHERE b.random_num = t.id;
请注意,用户定义的变量是特定于连接的。
这意味着该技术不能与连接池一起使用。
此外,主键必须是整数类型,并且其值必须在序列中且没有空格。
在本教程中,我们向您展示了几种从表中选择随机行的技术。