PHP MySQL按两列sorting

如何按两列对MySQL表进行sorting?

我想要的是按照最高收视率sorting的文章,然后是最近的date。 作为一个例子,这将是一个示例输出(左#是评级,然后是文章标题,然后是文章date)

 50 | 这篇文章是岩石的  2009年2月4日
 35 | 这篇文章很不错|  2009年2月1日
 5 | 这篇文章不是很热的|  2009年1月25日

我使用的相关SQL是:

ORDER BY article_rating, article_time DESC 

我可以按其中之一sorting,但不能同时sorting。

默认sorting是升序,您需要将关键字DESC添加到您的订单:

 ORDER BY article_rating DESC, article_time DESC 
 ORDER BY article_rating, article_time DESC 

只有在具有相同评级的两篇文章时,才会按article_time进行sorting。 在我的例子中,我可以看到,这正是发生的事情。

 ↓ primary sort secondary sort ↓ 1. 50 | This article rocks | Feb 4, 2009 3. 2. 35 | This article is pretty good | Feb 1, 2009 2. 3. 5 | This Article isn't so hot | Jan 25, 2009 1. 

但是要考虑:

 ↓ primary sort secondary sort ↓ 1. 50 | This article rocks | Feb 2, 2009 3. 1. 50 | This article rocks, too | Feb 4, 2009 4. 2. 35 | This article is pretty good | Feb 1, 2009 2. 3. 5 | This Article isn't so hot | Jan 25, 2009 1. 
 ORDER BY article_rating ASC , article_time DESC 

DESC将按两列降序sorting。 否则,您必须指定ASC

这也许可以帮助那些正在寻找按两列sorting表的方式,但是却是以并列方式。 这意味着使用聚合sortingfunction来结合两种sorting。 例如,使用全文search检索文章以及文章发布date时,这非常有用。

这只是一个例子,但是如果你理解了这个想法,你可以find很多使用的聚合函数。 你甚至可以对列进行加权来优先select一个。 我的这个function从两个方面来看都是极端的,因此最有价值的排在最前面。

对不起,如果存在简单的解决scheme做这个工作,但我还没有find任何。

 SELECT `id`, `text`, `date` FROM ( SELECT k.`id`, k.`text`, k.`date`, k.`match_order_id`, @row := @row + 1 as `date_order_id` FROM ( SELECT t.`id`, t.`text`, t.`date`, @row := @row + 1 as `match_order_id` FROM ( SELECT `art_id` AS `id`, `text` AS `text`, `date` AS `date`, MATCH (`text`) AGAINST (:string) AS `match` FROM int_art_fulltext WHERE MATCH (`text`) AGAINST (:string IN BOOLEAN MODE) LIMIT 0,101 ) t, ( SELECT @row := 0 ) r ORDER BY `match` DESC ) k, ( SELECT @row := 0 ) l ORDER BY k.`date` DESC ) s ORDER BY (1/`match_order_id`+1/`date_order_id`) DESC 

以下内容将按降序排列您的数据。

 ORDER BY article_rating DESC, article_time DESC