MySQL 随机选择特定选项
MySQL random with specific options
我需要从数据库中随机获取 20 行。我收到了这个查询:
SELECT * FROM `table_name` WHERE 1 ORDER BY rand() LIMIT 20
一切正常,但有 1 个问题。
- 如果数据库中的行数少于 20 行,例如 13 行,那么如何再随机复制 7 行直到答案正好是 20 行?
P.S。不用担心空虚。 table 永远不会为空。
你试试看如何:
SELECT * FROM 'tablename' WHERE 1 ORDER BY rand() LIMIT 1
做20次。您可能希望将结果存储在新的 table 中,也许使用 Select Into or/and Insert Into.
您可以使用存储过程实现此目的。这个选择随机行到临时 table 中,直到插入了所需的行数。如果源 table 中有足够多的行,则只有足够多的随机行插入到临时 table 中才能满足请求。如果不是,则将 table 的全部内容插入到临时 table 中足够多的时间来填充它。例如,当从只有 8 行的 table 中选择 20 个随机条目时,它会将 table 的所有 8 行(以随机顺序)插入临时 table,然后所有 8再次行(以不同的随机顺序),然后最后是 4 个随机行。然后返回临时 table 的全部内容。
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);
我需要从数据库中随机获取 20 行。我收到了这个查询:
SELECT * FROM `table_name` WHERE 1 ORDER BY rand() LIMIT 20
一切正常,但有 1 个问题。
- 如果数据库中的行数少于 20 行,例如 13 行,那么如何再随机复制 7 行直到答案正好是 20 行?
P.S。不用担心空虚。 table 永远不会为空。
你试试看如何:
SELECT * FROM 'tablename' WHERE 1 ORDER BY rand() LIMIT 1
做20次。您可能希望将结果存储在新的 table 中,也许使用 Select Into or/and Insert Into.
您可以使用存储过程实现此目的。这个选择随机行到临时 table 中,直到插入了所需的行数。如果源 table 中有足够多的行,则只有足够多的随机行插入到临时 table 中才能满足请求。如果不是,则将 table 的全部内容插入到临时 table 中足够多的时间来填充它。例如,当从只有 8 行的 table 中选择 20 个随机条目时,它会将 table 的所有 8 行(以随机顺序)插入临时 table,然后所有 8再次行(以不同的随机顺序),然后最后是 4 个随机行。然后返回临时 table 的全部内容。
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);