提前为“傻瓜编程”问题道歉......我之前对此事的讨论都是徒劳的。
所以我有一个装满动力艇的MySQL桌子。每行都有基本的动力艇信息(品牌/型号/等)以及1-10的分数,用于几个不同的特征 - “力量”,“舒适”和“风格”。我想帮助用户找到满足他们个性化需求的摩托艇。
默认情况下,数据按“totalscore”从高到低排序,如下所示:
$sql = "SELECT *,(power + comfort + style) as totalscore FROM boats ORDER BY totalscore DESC";
...然后我用PHP循环结果并将它们显示为列表。
然后我给用户一系列的是/否问题以确定个人偏好,我希望每个答案在用户会话中更改 totalscore的值 - 从而改变顺序列表项目。
换句话说,我希望$_SESSION["totalscore"]
随每个是/否用户输入而改变...然后用户的结果应该按照$_SESSION["totalscore"]
从高到低排序,而不是原来的总计数据库。
原理图示例
if Yes {
$_SESSION["totalscore"] = totalscore + style;
reorder list items by $_SESSION["totalscore"]; // the 350 is now #1
}
if No {
$_SESSION["totalscore"] = totalscore + (style/2);
reorder list items by $_SESSION["totalscore"]; // they're now tied for #1
}
等
在概念上绊倒我的是$_SESSION["totalscore"]
将被存储为cookie,而原始的totalalscore来自数据库查询。所以一旦我从totalscore切换到$_SESSION["totalscore"]
,我就不知道如何重新排序列表项。
如果只是以原理图的方式,有人能指出我正确的方向吗?我想弄清楚,但我不知道在这一点上要弄清楚什么。非常感谢。
答案 0 :(得分:0)
您可以将会话中的totalscore存储到从数据库中返回的结果中,并使用php的排序功能对结果进行重新排序。
答案 1 :(得分:0)
一种方法是,不是在查询中选择总分,然后对结果进行排序,而是每次用户更改首选项时进行查询
实施例
SELECT ( power + rating + style) as total_score from boats order by total_score;
然后遍历结果并显示第一组结果。为用户提供选项,然后再按以下步骤运行查询 -
if(style_matters)
{
$q = mysql_query("SELECT (power + rating + 2*style) as total_score from boats order by total_score");
//use this new result set in $q to present the new listing
}
else
{
$q = mysql_query("SELECT (power + rating + style/2) as total_score from boats order by total_score");
//use this for result set when style doesnt matter.
}
如果你有大量的数据库命中,这可能是一项昂贵的操作,但我认为这不是一个大问题。
您可以使用AJAX运行此查询以避免页面重新加载。
编辑:在你开始打6-7位数字之前,你甚至不会注意到多个数据库查询。虽然您不应该在查询中使用“SELECT * from”。始终指定要使用的确切列。在特定情况下,您可以限制向用户显示的结果数量。在一页上显示10个结果,在另一页上显示10个结果。限制结果可能会对查询产生重大影响。Does adding 'LIMIT 1' to MySQL queries make them faster when you know there will only be 1 result?