摘要:在本教程中,您将学习从 MySQL 数据库表中选择随机记录的各种技术。
有时,您必须从表中选择随机记录,例如:
- 在博客中随机选择一些帖子并将其显示在侧边栏中。
- 选择随机报价来显示“每日报价”小部件。
- 在图库中随机选择图片并用作特色图片。
MySQL 使用ORDER BY RAND()
选择随机记录
MySQL 没有任何内置语句来从表中选择随机行。为了实现这一点,您可以使用RAND()
函数。
以下查询从数据库表中选择随机行:
SELECT * FROM table_name
ORDER BY RAND()
LIMIT 1;
Code language: SQL (Structured Query Language) (sql)
让我们更详细地检查该查询。
如果要从数据库表中随机选择N
条记录,则需要更改LIMIT
子句,如下所示:
SELECT * FROM table_name
ORDER BY RAND()
LIMIT N;
Code language: SQL (Structured Query Language) (sql)
请参阅示例数据库中的以下customers
表。
以下示例从customers
表中随机选择五个客户:
SELECT
customerNumber,
customerName
FROM
customers
ORDER BY RAND()
LIMIT 5;
Code language: SQL (Structured Query Language) (sql)
请注意,您可能会得到不同的结果集,因为它是随机的。
这种技术对于小桌子非常有效。然而,对于大表来说会很慢,因为MySQL必须对整个表进行排序以选择随机的表。
查询的速度还取决于表中的行数。表的行数越多,为每行生成随机数所需的时间就越多。
MySQL 使用INNER JOIN
子句选择随机记录
以下查询根据主键列生成一个随机数:
SELECT
ROUND(RAND() * ( SELECT MAX(id) FROM table_name)) AS id;
Code language: SQL (Structured Query Language) (sql)
我们可以将表与上述查询返回的结果集连接起来,如下所示:
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;
Code language: SQL (Structured Query Language) (sql)
使用这一技术,您必须多次执行查询才能获得多个随机行,因为如果增加限制,查询将只提供从随机选择的行开始的连续行。
以下查询从customers
表中返回一个随机客户。
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;
Code language: SQL (Structured Query Language) (sql)
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;
Code language: SQL (Structured Query Language) (sql)
请注意,用户定义的变量是特定于连接的。这意味着该技术不能与连接池一起使用。另外,主键必须是整数类型,并且其值必须是无间隙的序列。
在本教程中,我们向您展示了从表中选择随机记录的几种技术。
本教程有帮助吗?