通过两列订购MySQL表


228

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

我想要的是文章,首先是最高评分,然后是最新日期。例如,这将是一个示例输出(左#是评分,然后是文章标题,然后是文章日期)

50 | 这篇文章令人震惊| 2009年2月4日
35 | 这篇文章相当不错| 2009年2月1日
5 | 这篇文章不是很热门| 2009年1月25日

我正在使用的相关SQL是:

ORDER BY article_rating, article_time DESC

我可以按一个或另一个排序,但不能两个都排序。

Answers:


480

默认排序是递增的,您需要在两个订单中都添加关键字DESC:

ORDER BY article_rating DESC, article_time DESC

奇。当我有两列,即名称和总计,并想按名称的字母顺序排序,并按总计的DESC顺序排序时,那么我只能看到,它是按名称排序的,而不是按总计排序的
Eugene

我无缘无故地使用(-1)* field1,field2破解了数字字段...谢谢。
Asad Hasan 2014年

hahaha ....不是一个很好的查询,因为如果您尝试尝试,则永远无法重新排列“空”值类别... 2009年尝试尝试..但在2015年无法正常工作;),正确的是“ 3 “或‘2’的子查询
国内配送

在这种情况下,这种查询不起作用。
Pra_A

4
我不知道为什么将其检查为答案,但事实并非如此。它按第一列排序,然后按第二列排序,但不是同时排序。
aidonsnous

34
ORDER BY article_rating, article_time DESC

仅当有两个具有相同评分的文章时,才会按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.

但请考虑:

 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.

谢谢@Tomalak
Jayani Sumudini'Apr

12
ORDER BY article_rating ASC , article_time DESC

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


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

34
哦,天哪,为什么要为这样一个简单的问题发布此类代码。
Ben Sinclair 2015年

4

下面将根据两列的降序对数据进行排序。

ORDER BY article_rating DESC, article_time DESC

3
四年后接受的答案的副本如何收到这么多的赞誉?
堆栈下溢

可能是由于解释原因:P
Rizwan Haider
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.