我读过一篇关于如何从包含大量数据的 SQL 表中随机选择一行(在某些条件下)的文章。他们得到 id 的最大值和最小值,并在它们之间生成一个随机数,并得到第一行的 id 比那个大。但是,我的 id 分布不均匀,所以我没有得到真正随机的行。例如,如果我的 id 是 1、100、101,我将几乎没有机会获得后面的两行。
但我想到了另一种解决方案。我没有获取最大 id,而是计算查询中的所有行,获取一个随机数 i 并选择第 i 个。代码看起来像这样
$count_res = $mysqli->query("SELECT COUNT(*) FROM quest WHERE category IN ({$mem['my_cate']})");
$count = $count_res->fetch_array();
$rand_id = rand(0, $count[0] - 1);
$result = $mysqli->query("SELECT * FROM quest WHERE category IN ({$mem['my_cate']}) LIMIT 1 OFFSET $rand_id");
但是,我怀疑它的有效性。任何人都可以给我一些想法,或者为我的案例提出解决方案。谢谢。