【问题标题】:Mysql: 'order by Rand() Limit 4 ' or not?Mysql:'order by Rand() Limit 4' 与否?
【发布时间】:2011-10-05 18:51:06
【问题描述】:

我需要从最新的新闻数据库中随机抽取 4 个条目。

由于该表有很多行,使用 RAND() 排序或浪费资源这样做是否明智?因为它将遍历整个表格并重新排序。

有没有更好的方法,从数百行的表中提取随机特征项?

示例:

$l=$database->query("SELECT car,price,thumbnail FROM cardb WHERE type='new' order by RAND() LIMIT 4");
foreach($l as $l){print_r($l);}

感谢您花时间回答 }

【问题讨论】:

标签: php mysql mysql-management


【解决方案1】:

嗯...我会在两个查询中执行此操作。获取随机行号:

SELECT
    floor(count * rand()) r1,
    floor(count * rand()) r2,
    floor(count * rand()) r3,
    floor(count * rand()) r4
FROM
    (SELECT count(*) count FROM cardb WHERE type = 'new') c

并获取行:

SELECT car, price, thumbnail FROM cardb WHERE type = 'new' LIMIT {r1}, 1
UNION ALL
SELECT car, price, thumbnail FROM cardb WHERE type = 'new' LIMIT {r2}, 1
UNION ALL
SELECT car, price, thumbnail FROM cardb WHERE type = 'new' LIMIT {r3}, 1
UNION ALL
SELECT car, price, thumbnail FROM cardb WHERE type = 'new' LIMIT {r4}, 1

【讨论】:

  • 该查询在结果集中可能有重复项。 ORDER BY RAND() 不会。
  • @MichaelMadsen 是的,但我认为在这种情况下这不是一个大问题。否则我们可以在 PHP 端生成唯一的随机数。无论如何,我认为这是最节省资源的解决方案之一。
猜你喜欢
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多