gpt4 book ai didi

mysql - 仅在一个查询中获取 RAND() 行而不使用 ORDER BY RAND()

转载 作者:行者123 更新时间:2023-11-29 01:19:08 24 4
gpt4 key购买 nike

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

SELECT quote FROM quotes ORDER BY RAND() LIMIT 1

Here is an article关于这个问题以及为什么会这样。

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

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 ;

关于mysql - 仅在一个查询中获取 RAND() 行而不使用 ORDER BY RAND(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311039/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com