MySQL Select Random Records

摘要:在本教程中,您将学习从 MySQL 数据库表中选择随机记录的各种技术。

有时,您必须从表中选择随机记录,例如:

  • 在博客中随机选择一些帖子并将其显示在侧边栏中。
  • 选择随机报价来显示“每日报价”小部件。
  • 在图库中随机选择图片并用作特色图片。

MySQL 使用ORDER BY RAND()选择随机记录

MySQL 没有任何内置语句来从表中选择随机行。为了实现这一点,您可以使用RAND()函数。

以下查询从数据库表中选择随机行:

SELECT * FROM table_name
ORDER BY RAND()
LIMIT 1;Code language: SQL (Structured Query Language) (sql)

让我们更详细地检查该查询。

  • 函数RAND()为表中的每一行生成一个随机值。
  • ORDER BY子句按RAND()函数生成的随机数对表中的所有行进行排序。
  • LIMIT子句选取随机排序的结果集中的第一行。

如果要从数据库表中随机选择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 select random customers

请注意,您可能会得到不同的结果集,因为它是随机的。

这种技术对于小桌子非常有效。然而,对于大表来说会很慢,因为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 使用 join 选择随机客户

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)

请注意,用户定义的变量是特定于连接的。这意味着该技术不能与连接池一起使用。另外,主键必须是整数类型,并且其值必须是无间隙的序列。

在本教程中,我们向您展示了从表中选择随机记录的几种技术。

本教程有帮助吗?