在MySQL上公平地选择随机行

时间:2011-08-03 21:46:25

标签: mysql sql random

我有一个MySQL表classifieds,它有以下字段:

  • id =主键,自动增量
  • titledesc,.........,其他字段,
  • featured = int(1)(1或0),但可以更改为true / false
  • featured_start(date)featured_end(date)

我想在我的主页上一次显示一次分类。我的意思是,它不会使用AJAX动态旋转,而是每次刷新或重新加载(F5)。

有人可以给我一些关于如何编码公平的 MySQL查询以获得一次分类的功能的想法吗?公平地说,那个被分类的人不能比其他人显示太多次,当然featured_end必须考虑到没有显示过期的分类广告。

3 个答案:

答案 0 :(得分:1)

考虑featured_end加入WHERE featured_end >= CURRENT_DATE,即

SELECT * 
FROM classifieds
WHERE (featured_end >= CURRENT_DATE)AND(featured = 1)
ORDER BY RAND()
LIMIT 1

答案 1 :(得分:1)

ORDER BY RAND() LIMIT 1是抓取随机行的经典简单方法。但是,它不能很好地扩展到表中的大量行 - 它必须为表中的每一行运行RAND()函数,然后对所有这些行进行排序(仅显示第一行)。 / p>

我建议阅读this useful article

tl; dr版本:最好的数据库端解决方案很可能是:

SELECT `your_table`.*
FROM `your_table`
JOIN
(
  SELECT CEIL(RAND() * (SELECT MAX(`id`) FROM `your_table`)) AS `id`
) AS `random_row` USING(`id`)

说真的,请仔细阅读该文章,这是我认为您会找到的最佳回答。

对于那些会提出主键中的空白会导致不准确这一事实的人:是的,他在我链接的帖子中涵盖了这一点。

答案 2 :(得分:0)

您可以尝试使用“RAND”功能 -

SELECT classifieds.* 
FROM classifieds
ORDER BY RAND()
LIMIT 1