PHP: 高级排序

4
我创建了一个房地产网站,希望按照列表的最后更新时间和完整性进行排序。因此,我一直在尝试找出如何通过mysql中的字段(completion_score)结合最近更新的列表来进行排序。完成得分将在100分制上进行评估,0为不好,100为完全完成。当添加和更新房源时,将计算房源的完整度并保存在mysql数据库中。我猜想我必须以某种方式将日期和完整度得分相结合,以便进行总体排序,但我不确定如何在一个SELECT语句中实现这一点。
目前我正在使用以下代码(显然没有考虑完整度得分):
ORDER BY ".$wpdb->prefix."fsrep_listings.listing_featured DESC, ".$wpdb->prefix."fsrep_listings.listing_last_updated DESC

我在考虑,如果任务在上周完成,我会给完成得分增加30分;如果在上个月完成,我会给完成得分增加20分;如果在过去三个月内完成,我会给完成得分增加10分。然后,我可以按照这个更新后的完成得分对任务进行排序。问题是,如何让它每天更改以调整得分。
根据马克的建议,我添加了以下代码:
ORDER BY $wpdb->prefix.'fsrep_listings.listing_score' + if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 1 WEEK,30,if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 1 MONTH,20,if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 3 MONTHS,10,0)))' DESC'; 

我遇到了以下解析错误:语法错误,意外的T_IF在/home/...中。

一个比另一个更重要吗?还是你试图让它们同等重要? - Amber
我建议删除PHP和WordPress标签,因为如果您想使用MySQL进行排序,它们与答案无关。 - John Carter
我正在尝试创建一个加权分数,使它们在某种程度上相等,但绝不是传统的ORDER BY last_update,completion_score。如果在最近一周内更新,则会增加30分,1个月20分,3个月10分。因此,如果列表百分之百完整并且在1.5个月前更新,则得分为110。 - Chris Allington
4个回答

3
你的想法听起来不错。为什么不试一试呢?
ORDER BY completion_score + IF(date > NOW()-INTERVAL 1 WEEK,30,IF(date > NOW()-INTERVAL 1 MONTH,20,IF(date > NOW()-INTERVAL 3 MONTHS,10,0))) DESC

无论如何,是关于IT技术的一些内容。


这更符合我的想法。我明天得试着搞一下。谢谢! - Chris Allington
1
我想翻译,但是我没有足够的声望。一旦我获得所需的15个积分,我就会翻译。我刚发现这个网站,它太棒了! - Chris Allington
@ChrisAllington:哦,我不知道投票有最低声望要求...这很遗憾。哈哈...欢迎来到S.O.!! 这确实是一个非常棒的网站。 - mpen
我输入了以下代码:$wpdb->prefix.'fsrep_listings.listing_score' + if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 1 WEEK,30,if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 1 MONTH,20,if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 3 MONTHS,10,0)))' DESC'; ---------- 然后我收到了以下解析错误:syntax error, unexpected T_IF in /home/... - Chris Allington
@jswolf19 我尝试使用'IF',但是出现了一个错误:解析错误:语法错误,在/home/...中意外的'('。 - Chris Allington
显示剩余3条评论

1

怎么样,类似这样的东西:

order by completeion_score - (to_days(now()) - to_days(completion_date))/3

或者类似的函数,根据完成后经过的天数。

更新

我给你的代码仅涉及SQL,没有涉及php,因此除了$wpdb->prefix部分之外,所有内容都应该在引号内。(我想这也适用于@Mark的答案以及其他大多数给出代码的答案。)

要添加您的前缀,您的代码应该类似于以下内容:

"ORDER BY ".$wpdb->prefix."fsrep_listings.listing_score - (to_days(now()) - to_days(".$wpdb->prefix."fsrep_listings.listing_last_updated))/3"

我收到了以下错误信息:致命错误:在/home...中调用未定义的函数to_days()。这是我的代码:ORDER BY $wpdb->prefix.'fsrep_listings.listing_score' - (to_days(now()) - to_days($wpdb->prefix.'fsrep_listings.listing_last_updated'))/3; - Chris Allington

0

你需要确定你想要排序的方式,但如果你想的话,可以使用 ORDER BY completion_date DESC, completion_score DESC,这将使最近的日期排在前面,在相等的日期内,它们将按分数排序。


1
我已经考虑过这种方法。问题在于,如果有人在星期一提交了一个非常不完整的列表,它会比星期二填写了100%的列表更高地显示出来。我想给人们提供既新鲜又完整的名单。 - Chris Allington

0
你可以反向思考,这样就不必更新旧条目。以当前的第0周为例,下一周是10,再下一周是20,以此类推。我认为你不需要使用QUERY来实现这个功能 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接