尝试这个:
SELECt *FROM ( SELECt @cnt := COUNT(*) + 1, @lim := 10 FROM t_random ) varsSTRAIGHT_JOIN ( SELECt r.*, @lim := @lim - 1 FROM t_random r WHERe (@cnt := @cnt - 1) AND RAND(20090301) < @lim / @cnt ) i
MyISAM(由于
COUNT(*)是即时的),此方法特别有效,但即使这样,
InnoDB其
10效率也比更高
ORDER BY RAND()。
这里的主要思想是我们不进行排序,而是保留两个变量并计算
running probability要在当前步骤中选择的行的。
有关更多详细信息,请参见我的博客中的这篇文章:
- 选择随机行
更新:
如果您只需要选择一条随机记录,请尝试以下操作:
SELECt aco.*FROM ( SELECt minid + FLOOR((maxid - minid) * RAND()) AS randid FROM ( SELECt MAX(ac_id) AS maxid, MIN(ac_id) AS minid FROM accomodation ) q ) q2JOIN accomodation acoON aco.ac_id = COALESCE ( ( SELECt accomodation.ac_id FROM accomodation WHERe ac_id > randid AND ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECt NULL FROM accomodation_category WHERe acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ), ( SELECt accomodation.ac_id FROM accomodation WHERe ac_status != 'draft' AND ac_images != 'b:0;' AND NOT EXISTS ( SELECt NULL FROM accomodation_category WHERe acat_id = ac_category AND acat_slug = 'vendeglatohely' ) ORDER BY ac_id LIMIT 1 ) )
假设您
ac_id的或多或少均匀分布。



