我需要从数据库中获取20个随机行。我收到了这个问题:
SELECT * FROM `table_name` WHERE 1 ORDER BY rand() LIMIT 20
一切正常,但有一个问题。
P.S。不要担心空虚。该表永远不会为空。
答案 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);