MySQL随机具有特定选项

时间:2018-05-13 19:11:55

标签: mysql sql rows myisam

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

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

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

  • 如果数据库中的行少于20行,例如13,那么如何在答案中复制7个以上的随机行正好是20行?

P.S。不要担心空虚。该表永远不会为空。

2 个答案:

答案 0 :(得分:0)

你怎么试试:

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

并做了20次。您可能希望将结果存储在新表中,可能使用Select Into或/和Insert Into。

答案 1 :(得分:0)

您可以使用存储过程实现此目的。这个选择随机行到临时表中,直到插入了所需的行数。如果源表中有足够的行,则只有一个插入临时表,具有足够的随机行来满足请求。如果不是,则将表的全部内容插入临时表足以填充它。例如,当从一个只有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);