mysql随机提供特定选项

vxbzzdmp  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(638)

我需要从数据库中随机抽取20行。我有个问题:

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

一切正常,但有一个问题。
如果数据库中的行数少于20行,例如13行,那么如何再复制7个随机行,直到答案中正好有20行?
p、 别担心空虚。table从来都不是空的。

e5njpo68

e5njpo681#

不如你试试:

SELECT * FROM 'tablename' WHERE 1 ORDER BY rand() LIMIT 1

做20次。您可能希望将结果存储在新表中,可以使用select into或/和insert into。

mjqavswn

mjqavswn2#

您可以通过存储过程来实现这一点。这个函数将随机选择一个临时表中的行,直到插入所需的行数为止。如果源表中有足够的行,则只有一个插入到临时表中,其中有足够的随机行来满足请求。如果没有,则将表的全部内容插入到临时表中足够的次数来填充它。例如,当从一个只有8行的表中选择20个随机条目时,它会将表中的所有8行(以随机顺序)插入临时表,然后再次插入所有8行(以不同的随机顺序),最后插入4个随机行。然后返回临时表的全部内容。

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

相关问题