【问题标题】:MySQL random with specific options带有特定选项的 MySQL 随机
【发布时间】:2018-05-13 19:11:54
【问题描述】:

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

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

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

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

附言不要担心空虚。该表永远不会为空。

【问题讨论】:

  • 你想用这个实现什么?如果行数小于 20,为什么要重复数据
  • 如果只有 3 行怎么办?如果只有 1 行怎么办?
  • 我能提供的一切,我已经做到了。对不起,但我无法说出我想要达到的目标。我只需要解决我的问题。
  • @Strawberry,我已经回答了你的问题,请仔细阅读:)
  • 您使用什么服务器端语言?您希望表中同时存在的绝对最大记录数是多少?

标签: mysql sql rows myisam


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    你试试怎么样:

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

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

    【讨论】:

    • 感谢您的回答,但这种方法不是我想要的。如果我使用这个查询 20 次并且表中有超过 20 行,那么我可以在结果中得到重复的行。简而言之,如果表中的行数超过 20 行,我不想得到重复的行。
    • @bek 但那是说当它小于 20 时会发生这种情况?您需要对问题的描述非常敏锐。
    • @maytham-ɯɐɥʇʎɐɯ,我很抱歉,是的,我说它必须在小于 20 时发生,但我没有说当它大于或等于时我需要重复20.
    • 我不太确定你想要什么。如果您的表少于 20 行并且您仍想强制 20 个随机选择,那么您必须获得重复项。如果没有,你需要加入某种公式,一个计算。但是我不知道你的数据库编号是多少,所以不知道这是什么公式。
    • @bek - 你改变了规则。从技术上讲,1000 行中的 20 随机行可能有重复。如果表中超过 20 个,现在您不想重复吗?
    猜你喜欢
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2016-08-07
    相关资源
    最近更新 更多