mysql随机提供特定选项

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

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

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

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

e5njpo68

e5njpo681#

不如你试试:

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

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

mjqavswn

mjqavswn2#

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

  1. DELIMITER //
  2. DROP PROCEDURE IF EXISTS select_random //
  3. CREATE PROCEDURE select_random (IN tablename VARCHAR(256), IN numrows INT)
  4. BEGIN
  5. DECLARE rowcnt INT DEFAULT numrows;
  6. SET @q = CONCAT('CREATE TEMPORARY TABLE random LIKE ', tablename);
  7. PREPARE stmt FROM @q;
  8. EXECUTE stmt;
  9. SET @q = CONCAT('SELECT COUNT(*) INTO @totrows FROM ', tablename);
  10. PREPARE stmt FROM @q;
  11. EXECUTE stmt;
  12. REPEAT
  13. SET @q = CONCAT('INSERT INTO random SELECT * FROM ', tablename, ' ORDER BY RAND() LIMIT ', LEAST(@totrows, rowcnt));
  14. PREPARE stmt FROM @q;
  15. EXECUTE stmt;
  16. SET rowcnt = rowcnt - @totrows;
  17. UNTIL rowcnt <= 0
  18. END REPEAT;
  19. SELECT * FROM random;
  20. DROP TABLE random;
  21. END
  22. //
  23. CALL select_random('table_name', 20);
展开查看全部

相关问题