当前位置: 首页 > 面试题库 >

只需一个查询即可获取不带ORDER BY RAND()的RAND()行

党源
2023-03-14
问题内容

在MySQL中使用RAND()从巨大的表中获取单个随机行非常慢:

SELECT quote FROM quotes ORDER BY RAND() LIMIT 1

这是有关此问题的文章,以及为什么会这样。

他们的解决方案是使用两个查询:

SELECT COUNT(*) AS cnt FROM quotes

- Use result to generate a number between 0 and COUNT(*)

SELECT quote FROM quotes LIMIT $generated_number, 1

我想知道,是否只有一个查询就能做到这一点。

所以我的方法是:

SELECT * FROM quotes
LIMIT (
  ROUND(
    (SELECT COUNT(*) FROM quotes) * RAND()
  )
), 1

但是它暗示MySQL在Limit内不允许任何逻辑。尽管我找不到有关此主题的任何信息,但这是否是正确的。

所以我的问题:

  1. 如何在LIMIT内使用RAND()?
  2. 您是否知道其他任何解决方法,只需一个查询即可解决?

问题答案:

有一个原因为什么不能使用存储过程来创建准备好的语句?

DELIMITER //
DROP PROCEDURE IF EXISTS rand_quote//
CREATE PROCEDURE rand_quote()
BEGIN
    SET @rand := ROUND((SELECT COUNT(*) FROM quotes) * RAND());
    SET @sql := CONCAT('SELECT * FROM quotes LIMIT ', @rand, ', 1');
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END;
//
DELIMITER ;


 类似资料:
  • 我如何从一个可观察的对象中获取当前值而不订阅它?我只需要当前值一次,而不是新值。

  • 问题内容: 我想在应用程序中连接到wifi网络。 码: 但是问题是我不知道。如何获取WiFi网络的SSID ? 问题答案: 如果您想获得所有可用的wifi: 如果要连接wifi ssid: 如果您想添加新的wifi设置,我已在下面编写了演示应用程序:

  • 问题内容: 我必须在遗留数据库的表中插入一些记录,并且由于其他古代系统使用了该记录,因此更改表不是解决方案。 问题在于目标表具有int主键,但没有标识规范。因此,我必须找到下一个可用的ID并使用该ID: 但是,在执行此操作时,我想防止其他应用程序插入表中,以免出现任何问题。我尝试了这个: 在SQL Management Studio中的两个不同的窗口中,一个事务始终作为死锁受害者被杀死。 我也首先

  • 我现在在大学学习数据库,在我的项目中,我有3个表:、和 联赛(leagueId,leagueName) 团队(teamId,teamName) 具有(leagueId,teamId,year)

  • 我的桌子如下所示 我需要如下所示的输出结果Mysql查询结果必须包含arr_date、unload_date分组中的max date值:name、auto_num、seal_num 我想在这里使用什么查询请帮助我,

  • 我们正在将MyBatis用于我正在进行的一个项目。我在尝试使用结果图获取结果时遇到了一个问题。 mapper.xml 在上述文件中需要注意的重要事项是,我们通过不同的别名在选择查询中两次获取名为CTN_DTR_NM的列(请参阅Value_Columns_List)。这是因为channel_map表包含CTN_DTR_NM。通道映射表还包含对另一个包含CTN_DTR_NM的表的引用。 我面临的问题是