在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内不允许任何逻辑。尽管我找不到有关此主题的任何信息,但这是否是正确的。
所以我的问题:
有一个原因为什么不能使用存储过程来创建准备好的语句?
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的表的引用。 我面临的问题是