0

为“傻瓜编程”问题提前道歉......我徒劳地搜索了先前关于此的讨论。

所以我有一个装满摩托艇的 MySQL 表。每行都有基本的摩托艇信息(品牌/型号/等)加上一些不同特征的 1-10 分——“动力”、“舒适度”和“风格”。我想帮助用户找到满足他们个人需求的摩托艇。

默认情况下,数据按“总分”从高到低排序,如下所示:

$sql = "SELECT *,(power + comfort + style) as totalscore FROM boats ORDER BY totalscore DESC";

...我用 PHP 循环遍历结果并将它们显示为列表。

但随后我给用户一系列是/否问题来确定个人偏好,并且我希望每个答案都能改变用户会话中总分的值——从而改变列表项的顺序。

换句话说,我想$_SESSION["totalscore"]改变每个是/否用户输入......然后用户的结果应该从高到低排序$_SESSION["totalscore"],而不是数据库中的原始总分。

示意图示例

  1. 波士顿捕鲸船 370。力量=7,舒适度=8,风格=6,总分=21
  2. 波士顿捕鲸船 350。力量=5,舒适度=7,风格=8,总分=20

问题1:你喜欢时尚吗?是/否

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,而原始总分来自数据库查询。因此,一旦我从 totalscore 切换到$_SESSION["totalscore"],我不知道如何重新排序列表项。

有人能指出我正确的方向吗,如果只是示意性的?我想弄清楚,但我不确定此时要弄清楚什么。非常感谢。

4

2 回答 2

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 个结果。限制结果会对查询产生重大影响。

当您知道只有 1 个结果时,向 MySQL 查询添加“LIMIT 1”是否会使它们更快?

没有双重查询的MySQL分页?

于 2013-04-25T04:00:19.813 回答
0

您可以将会话中的总分存储到从数据库返回的结果中,并使用 php 的排序功能对结果进行重新排序。

于 2013-04-25T00:49:54.287 回答