【发布时间】:2013-04-01 22:16:48
【问题描述】:
请问我需要什么查询才能在我的表中随机选择 JUST ONE ROW?
我试过了:
SELECT *
FROM `table`
ORDER BY RAND()
LIMIT 0,1;
而且它似乎很慢,有时不起作用。
谢谢
【问题讨论】:
-
只是出于好奇......它有时怎么会不起作用?
标签: mysql
请问我需要什么查询才能在我的表中随机选择 JUST ONE ROW?
我试过了:
SELECT *
FROM `table`
ORDER BY RAND()
LIMIT 0,1;
而且它似乎很慢,有时不起作用。
谢谢
【问题讨论】:
标签: mysql
您可以创建一个STORED PROCEDURE,其中包含一个动态 SQL 来获取随机记录,
DELIMITER $$
CREATE PROCEDURE SelectOne()
BEGIN
SET @rownum := (SELECT count(*) FROM TableName);
SET @start := (SELECT FLOOR((rand() * @rownum)));
SET @sql = CONCAT('SELECT * FROM TableName LIMIT ?, 1');
PREPARE stmt FROM @sql;
EXECUTE stmt USING @start;
DEALLOCATE PREPARE stmt;
END $$
DELIMITER ;
感谢Jack改进:)
【讨论】:
FLOOR(RAND() * @rownum) 并让@rownum 等于count(),否则你会饿死第一条记录。 sqlfiddle.com/#!2/43948/4
:)
COUNT(*)在使用InnoDB时有不同的运行时:)
:)
如果表很大,ORDER BY 会很慢。相反,您可以根据表中的行数选择一个随机偏移量。
SELECT * FROM table LIMIT 1 OFFSET ?
? 是一个随机数 SELECT COUNT(*) FROM table
【讨论】: