第1个回答 2014-07-27
// 第一种我测试了一下,需要0.5秒
$map = array('id'=> array('exp',' >= (SELECT FLOOR( MAX(id) * RAND()) FROM `'.C('DB_PREFIX').'custom_reply_news` )'));
$dd = M("custom_reply_news")->where($map)->order('id')->find();
dump($dd);
// 第二种查询时间只有0.01秒
$map = array('id'=> array('exp',' >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `'.C('DB_PREFIX').'custom_reply_news`)))'));
$dd = M("custom_reply_news")->where($map)->order('id')->find();
dump($dd);
// 第三种加上了MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
$map = array('id'=> array('exp',' >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `'.C('DB_PREFIX').'custom_reply_news`)-(SELECT MIN(id) FROM `'.C('DB_PREFIX').'custom_reply_news`)) + (SELECT MIN(id) FROM `'.C('DB_PREFIX').'custom_reply_news`)))'));
$dd = M("custom_reply_news")->where($map)->order('id')->find();
dump($dd);
// 第四种采用JOIN的语法比直接在WHERE中使用函数效率还要高很多
$dd = M("custom_reply_news t1")->join('(SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `'.C('DB_PREFIX').'custom_reply_news`)-(SELECT MIN(id) FROM `'.C('DB_PREFIX').'custom_reply_news`))+(SELECT MIN(id) FROM `'.C('DB_PREFIX').'custom_reply_news`)) AS id) as t2')
->where("t1.id >= t2.id")->order('t1.id')->find();
dump($dd);