2

我必须从一列中随机选择 4 行。

最好随机生成 4 个 id 并执行 4 个请求“从 id = ... 的数据库中选择列”

或者选择一个请求中的所有行并在之后选择?

4

3 回答 3

0

尽管该RAND()功能可能很慢,但到目前为止,我还没有遇到速度方面的重大问题。我的策略实际上是将数据库加入到自身的查询中,返回带有限制的随机 ID 列表。

SELECT *
FROM table AS t1
JOIN (
    SELECT rowID
    FROM table
    ORDER BY RAND()
    LIMIT 4
) AS t2
WHERE t1.rowID = t2.rowID

还有一个更强大的解决方案 - 尝试查看这个问题(在 2010 年提出)。

于 2013-06-02T17:04:52.393 回答
0

如前所述, where id in (id1, id2, id3, id4)从 MySQL 的角度来看,这是最快的方法。但是,您将需要在应用程序中生成这些 ID 的一些逻辑:所有 4 个 ID 都应存在,随机分布,并且您希望避免重复。在最坏的情况下,您将通过大量查询检索所有存在 ID 的列表,提取 4 个随机值,然后再次查询。

完成所有这些逻辑后,将选择移至 MySQL 是明智之举:

SELECT * FROM foobar
ORDER BY RAND()
LIMIT 4;

您必须了解这在 mysql中很慢,但是您在应用程序逻辑中获得了速度增益,并且可以确保在整个表中获得相同的随机值。

编辑:评论询问 PHP 是否在此任务中固定,然后是 MySQL。答案是否定的。它不是通过“使用 rand”来完成的。您需要有一个包含 PHP 中所有这些 ID 的数组。这是一个巨大的查询,大量的 TCP 流量,巨大的数组要在 php 中构建,巨大的 btree 要由 zend 引擎构建。然后,使用这些 ID,您必须触发第二个查询以获取这些 ID 的行。

于 2013-06-02T16:48:09.773 回答
0

如果您能够生成随机的现有 id,我认为最好的方法是使用类似where id in (id1, id2, id3, id4). 这将导致在一次查询中获得 4 条记录,因此不会获取不必要的查询或记录。

于 2013-06-02T16:42:28.253 回答