按两列排序MySQL表

214 mysql sql-order-by

如何按两列对MySQL表进行排序?

我想要的是按最高评分排序的文章,然后是最近的日期.作为一个例子,这将是一个示例输出(左#是评级,然后是文章标题,然后是文章日期)

50 | This article rocks          | Feb 4, 2009
35 | This article is pretty good | Feb 1, 2009
5  | This Article isn't so hot   | Jan 25, 2009

我正在使用的相关SQL是:

ORDER BY article_rating, article_time DESC
Run Code Online (Sandbox Code Playgroud)

我可以按其中一种排序,但不能同时排序.

tru*_*ppo 453

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

ORDER BY article_rating DESC, article_time DESC
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么将其检查为答案,但事实并非如此。它按第一列排序,然后按第二列排序,但不是同时排序。 (3认同)
  • @aidonsnous 这正是本例中所需要的?先按 1 列排序,然后再按另一列排序是解决方案 (2认同)

Tom*_*lak 31

ORDER BY article_rating, article_time DESC
Run Code Online (Sandbox Code Playgroud)

仅当有两篇具有相同评级的文章时才会按article_time排序.从我在你的例子中可以看到的一切,这正是发生的事情.

? 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.
Run Code Online (Sandbox Code Playgroud)

但考虑一下:

? 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.
Run Code Online (Sandbox Code Playgroud)


Lea*_*ing 11

ORDER BY article_rating ASC , article_time DESC
Run Code Online (Sandbox Code Playgroud)

DESC最后将按两列降序排序.您必须指定ASC是否需要它


Jir*_*ous 8

这可能有助于那些正在寻找通过两列排序表的方式的人,但是以并列的方式.这意味着使用聚合排序功能组合两种排序.例如,在使用全文搜索检索文章以及文章发布日期时,它非常有用.

这只是一个例子,但是如果你理解了这个想法,你可以找到很多要使用的聚合函数.您甚至可以对列进行加权,使其优先于一秒钟.我的功能从两种类型中都是极端的,因此最有价值的行位于顶部.

对不起,如果存在更简单的解决方案来完成这项工作,但我还没有找到.

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
Run Code Online (Sandbox Code Playgroud)

  • 哦,天哪,为什么你会发布这样一个简单问题的代码. (29认同)

小智 5

以下将根据两列按降序对您的数据进行排序。

ORDER BY article_rating DESC, article_time DESC
Run Code Online (Sandbox Code Playgroud)

  • 4 年后接受的答案副本如何获得这么多赞成票? (4认同)