MySQL选择随机行

时间:2019-11-20 08:52:33  来源:igfitidea点击:

简介:在本教程中,您将学习各种技术以从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;

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

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