PHP>按名称排序查询结果,同时让每个字母有时位于顶部

问题描述:

我目前正在一个网站上显示在线商店列表, 每个商店都将存储在我的数据库中,我将使用PHP来选择并显示它们。PHP>按名称排序查询结果,同时让每个字母有时位于顶部

但是既然这些商店会支付我的费用,我想让每个商店有时候都在排行榜的顶端, (例如,如果商店名称以“Z”开头,他们可能会抱怨所有时间都在列表底部,所以我想保持公平)。

所以我想让每个字母在列表的顶部一个小时,但我不知道该怎么做.. 这甚至可能吗?

在此先感谢!

+1

还有一点需要记住的是,即使您希望对开店者“公平”,您也希望保持网站与您v的一致性isitors。如果你的访客不断寻找到商店的链接,因为它不断移动,他们会感到沮丧,可能不会使用你的网站。在我看来,您需要找到一种方式来对开店者“公平”,同时为访客保持一致的体验。 – 2011-01-10 16:40:33

我会显示一个单独的盒子,并在它只是一个商店把它称为“当今的挑”什么类型的这一点很快的。这样,您可以偶尔将以“Z”开头的商店推到顶部,同时保持用户正常排序的商店列表体验。

然后使用数据库来保存哪个商店已经在“今天的选择”框中多少次,让他们都平等。

在没有为模式添加“优先级”字段的情况下(虽然有可能,它最多只会令人费解),但直接在SQL中处理这个问题并没有任何理智的方法(我知道)。这就是说,这里有两个建议:

修改您的模式

一个简单的“优先权”字段添加到相关模式和按优先级排序,姓名(或任何默认是)。您当然需要每小时重置优先级字段,但这是一项相当平凡的任务。

处理它在PHP

  1. 开展查询按往常一样。

  2. 将所有结果都抓取到数组中。

  3. 根据当前小时根据需要重新排列优先顺序。 (您需要array_splice您想要从阵列中跳出的项目,然后array_unshift将它们置顶。)

  4. 基于数组的输出。

这当然会变得更复杂/效率更低,如果你需要处理分页,但基本的想法是相同的。

一个很好的解决方案是将另一列添加到带有商店名称的数据库中,并将其称为“last_shown”,然后当您显示该商店时,使用时间戳更新列,并且每个选择都执行如下操作:

“SELECT名称,连接距离商店ORDER BY last_shown DESC”

然后在PHP你可以检查

<?php 

if($row['last_shown']+3600 > now()){ 
    //run select but in ASC order 
    //update the new row's column to the current timestamp 

} 



?> 

这样,它只会更新一次一小时,但除此之外,它会继续选择在列表顶部购物R上的小时

抱歉它是一个有点乱,我只是在工作

如图所示店可以在架构 2)order by shown_times asc 3)&添加 1)额外列shown_times你会+1

另一种解决方案: 你甚至可以使用ORDER BY RAND()