PHP:高级ORDER BY

时间:2011-10-15 03:46:20

标签: php mysql

我创建了一个房地产网站,我希望按照上次更新和列表的完整性对列表进行排序。所以我一直试图弄清楚如何通过mysql(completion_score)中的字段与最近更新的列表进行排序。完成得分将是100分,0分为差,100分完全完成。我将在添加和更新列表并将其保存在mysql数据库中时计算完成分数。我猜我将不得不以某种方式结合日期和completion_score来制作一个总数,但我不确定如何在一个SELECT中执行此操作。

目前我正在使用此功能(显然不考虑完成分数):

ORDER BY ".$wpdb->prefix."fsrep_listings.listing_featured DESC, ".$wpdb->prefix."fsrep_listings.listing_last_updated DESC

我在想,如果它在上周完成,我会在完成分数上加30分,如果在上个月完成,我会在完成分数上加20分,如果在完成分数中完成最后三个月我会在完成得分上加10分。然后我可以通过这个更新的完成分数来订购它。问题是我如何每天更改以调整分数。

根据Mark的建议,我输入了以下代码:

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'; 

然后我收到了以下Parse错误:语法错误,/ home /...

中的意外T_IF

4 个答案:

答案 0 :(得分: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

无论如何都有这样的效果。

答案 1 :(得分: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"

答案 2 :(得分:0)

您需要准确确定排序的工作方式,但如果您愿意,可以ORDER BY completion_date DESC, completion_score DESC,这将在最近的几天内提供最新的日期,在相同的日期,它们将按分数排序。

答案 3 :(得分:0)

您可以反过来考虑它,这样您就不必更新旧条目。考虑当前的第0周,然后是下周的10,接下来的20,依此类推。我认为你不需要QUERY:)