当前位置: 首页 > 面试题库 >

使用MySQL选择随机行

秦鸿羽
2023-03-14
问题内容

我看到了许多与此主题有关的主题,但在了解如何做到这一点上一直没有成功。

例如,如果我有此表:

+------+-------+-------+
| id   | name  | class |
+------+-------+-------+
|    5 | test  | one   | 
|   10 | test2 | one   | 
|   12 | test5 | one   | 
|    7 | test6 | two   | 
+------+-------+-------+

并且我只想显示“一个”类中的X个随机行,我该怎么做?

注意 :这是一张大桌子,所以我不想使用ORDER BY RAND


问题答案:

ORDER BY RAND()如您所知,大多数人推荐的解决方案无法扩展到大型表。

SET @r := (SELECT FLOOR(RAND() * (SELECT COUNT(*) FROM mytable)));
SET @sql := CONCAT('SELECT * FROM mytable LIMIT 1 OFFSET ', @r);
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;

我在《SQL反模式:避免数据库编程的陷阱》一书中介绍了该解决方案和其他解决方案。

如果要使用PHP进行此操作,则可以执行以下操作(未测试):

<?php
$mysqli->begin_transaction();
$result = $mysqli->query("SELECT COUNT(*) FROM mytable")
$row = $result->fetch_row(); 
$count = $row[0]; 
$offset = mt_rand(0, $count);
$result = $mysqli->query("SELECT * FROM mytable LIMIT 1 OFFSET $offset");
...
$mysqli->commit();


 类似资料:
  • 问题内容: 我正在使用PHP和MySQL创建一个简单的Web应用程序。在其中,我需要以随机顺序从表中随机选择一小组行。如何使用MySQL实现此类目标? 问题答案: SELECT * FROM table ORDER BY RAND() LIMIT 10;

  • 问题内容: 这是我的表结构。在这里我想随机选择4行,所以我在查询中使用RAND()mysql函数,我的问题是 如何配对到行。我的意思是,我想始终选择pid 2和3。我需要按以下顺序。 我不想打破对A2 A3 或或或等 我使用下面的查询,但对我不起作用 问题答案: turbod与他的答案很接近,他只是随机排序,当您似乎想要按pid排序时,在获得所需的随机行以及与A2和A3有关的行之后:

  • 问题 你想从一个序列中随机抽取若干元素,或者想生成几个随机数。 解决方案 random 模块有大量的函数用来产生随机数和随机选择元素。 比如,要想从一个序列中随机的抽取一个元素,可以使用 random.choice() : >>> import random >>> values = [1, 2, 3, 4, 5, 6] >>> random.choice(values) 2 >>> random

  • 问题内容: 有没有一种方法可以随机选择一个功能? 例: 上面的代码似乎执行所有3个功能,而不仅仅是随机选择的一个。正确的方法是什么? 问题答案: Python函数是一流的对象:您可以按名称引用它们,而无需调用它们,然后在以后调用它们。 在您的原始代码中,您要调用这三个代码,然后在结果中随机选择。在这里,我们随机选择一个函数,然后调用它。

  • 我有一个概率问题: 在任何一天,埃里克要么是快乐的(C),要么是马马虎虎的(S),要么是闷闷不乐的(G)。 如果他今天很高兴,那么他明天将是C、S或G,相应的概率为0.5、0.3、0.2。 如果他今天感觉一般,那么他明天会是C,S或G,概率是0.3,0.4,0.3。 如果他今天闷闷不乐,那么他明天会是C,S或G,概率是0.2,0.2,0.6。 我在R中生成了50,000个独立的伪随机数(均匀的),

  • 问题内容: 这是我在数据库中查询一些单词的方法 我正在使用mysql,我想获得符合条件的随机行,我在查询中使用rand()的顺序。 我发现这个类似的问题基本上表明,由于在理论中不支持ORDER BY RAND,因此可以将主键随机化。但是,在我的情况下无法做到这一点,因为我有一个搜索条件和一个where子句,因此并非每个主键都可以满足该条件。 我还找到了一个代码段,建议您使用OFFSET来随机化行,