我有一个基本的MySQL查询:
$getFeed = "SELECT posts.postID, posts.postTitle, .....
FROM posts
LEFT JOIN users ON posts.userID = users.id
LEFT JOIN postScore ON posts.postID = postScore.postID
GROUP BY posts.postID
$feedResult = mysql_query($getFeed) or die;
while($row1 = mysql_fetch_array($feedResult)){
$postOwner = $row1["userID"];
$postID = $row1["postID"];
etc...
}
所以现在这里是我被困的地方。我想通过某种投票,时间戳等组合使用PHP来订购Feed。基本上创建一个非常简单的得分算法。我需要使用上面的一些变量来进行数学运算,然后按顺序显示结果。我怎么能用PHP做到这一点?
其他问题,我应该使用PHP动态执行此操作还是将算法“得分”保存在数据库中,然后按该列排序?
编辑:假设我将分数存储在DB中,但是这个“分数”将基于时间敏感的算法(意味着分数会随着时间的推移而变化)。是否适合创建一个以一定间隔运行的后端脚本来更新数据库中的所有分数?
答案 0 :(得分:3)
如果你可以在拉动它们之前在MySQL中对它们进行排名,效率会更高。在PHP中对中等到大型数据集进行排序是资源密集型的。
答案 1 :(得分:1)
通常最好在数据库中订购它。原因有几个 1.对于php进程,结果集可能太大了。 2.数据库中的LIMIT和分页速度更快。
但是,如果你想用PHP做,那么
这是模式。首先将记录放入一个数组中,然后使用其中一个php排序函数对它们进行排序。
while($row1 = mysql_fetch_array($feedResult)){
$rows[] = $row1;
}
usort($rows, 'mycmp');
function mycmp($a, $b)
{
if ($a['score'] == $b['score']) {
return 0;
}
return ($a['score'] < $b['score']) ? -1 : 1;
}
答案 2 :(得分:0)
如果您想动态执行此操作,请查看usort
是否要将此“得分”存储在数据库中取决于您的应用程序的要求。它基本上是存储空间和速度之间的权衡。如果将它存储在数据库中,则会丢失存储空间,但如果您在运行中进行计算,则会失去速度。
虽然在这种特殊情况下,这个小的存储空间开销并不值得担心,而且加速速度超过了它。
简短回答:事先将分数保存在数据库中:)