MySQL 随机选择特定选项

MySQL random with specific options

我需要从数据库中随机获取 20 行。我收到了这个查询:

SELECT * FROM `table_name` WHERE 1 ORDER BY rand() LIMIT 20

一切正常,但有 1 个问题。

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);