DELIMITER //
DROP PROCEDURE IF EXISTS select_random //
CREATE PROCEDURE select_random (IN tablename VARCHAR(256), IN numrows INT)
BEGIN
DECLARE rowcnt INT DEFAULT numrows;
SET @q = CONCAT('CREATE TEMPORARY TABLE random LIKE ', tablename);
PREPARE stmt FROM @q;
EXECUTE stmt;
SET @q = CONCAT('SELECT COUNT(*) INTO @totrows FROM ', tablename);
PREPARE stmt FROM @q;
EXECUTE stmt;
REPEAT
SET @q = CONCAT('INSERT INTO random SELECT * FROM ', tablename, ' ORDER BY RAND() LIMIT ', LEAST(@totrows, rowcnt));
PREPARE stmt FROM @q;
EXECUTE stmt;
SET rowcnt = rowcnt - @totrows;
UNTIL rowcnt <= 0
END REPEAT;
SELECT * FROM random;
DROP TABLE random;
END
//
CALL select_random('table_name', 20);
2条答案
按热度按时间e5njpo681#
不如你试试:
做20次。您可能希望将结果存储在新表中,可以使用select into或/和insert into。
mjqavswn2#
您可以通过存储过程来实现这一点。这个函数将随机选择一个临时表中的行,直到插入所需的行数为止。如果源表中有足够的行,则只有一个插入到临时表中,其中有足够的随机行来满足请求。如果没有,则将表的全部内容插入到临时表中足够的次数来填充它。例如,当从一个只有8行的表中选择20个随机条目时,它会将表中的所有8行(以随机顺序)插入临时表,然后再次插入所有8行(以不同的随机顺序),最后插入4个随机行。然后返回临时表的全部内容。