按两列对 MySQL 表排序

Posted

技术标签:

【中文标题】按两列对 MySQL 表排序【英文标题】:Order a MySQL table by two columns 【发布时间】:2010-10-05 14:56:57 【问题描述】:

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

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

+================+==============================+== =============+ | article_rating |文章 |文章时间 | +================+==============================+== =============+ | 50 |这篇文章震撼 | 2009 年 2 月 4 日 | +----------------+-----------------------------+-- ------------+ | 35 |这篇文章不错| 2009 年 2 月 1 日 | +----------------+-----------------------------+-- ------------+ | 5 |这篇文章不那么热了| 2009 年 1 月 25 日 | +================+==============================+== =============+

我正在使用的相关 SQL 是:

ORDER BY article_rating, article_time DESC

我可以按其中一个排序,但不能同时排序。

【问题讨论】:

【参考方案1】:

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

ORDER BY article_rating DESC, article_time DESC

【讨论】:

奇数。当我有两列,名称和总数,并希望按名称的字母顺序和总数的 DESC 排序时,我只看到它是按名称排序的,而不是按总数排序的 我在数字字段上无缘无故地使用 (-1)*field1, field2...谢谢。 hahaha .... 不是一个很好的查询,因为如果您尝试,永远无法重新排序“空”值类别...在 2009 年很好尝试.. 但在 2015 年无法正常工作;),正确的是“3”或“2”子查询 这样的查询在我的情况下不起作用.. 在这种情况下,我没有对 City select distinct City, Country from customers order by Country desc, City desc 进行排序; 我不知道为什么这被检查为答案,但事实并非如此。它按第一列排序,然后是第二列,但不能同时排序。【参考方案2】:
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.

【讨论】:

【参考方案3】:
ORDER BY article_rating ASC , article_time DESC

DESC 最后将按两列降序排序。如果需要,您必须指定ASC,否则

【讨论】:

【参考方案4】:

这可能会帮助那些正在寻找按两列但以并行方式对表格进行排序的方法的人。这意味着使用聚合排序功能组合两种排序。例如,在使用全文搜索检索文章以及涉及文章发布日期时,它非常有用。

这只是一个例子,但如果你抓住了这个想法,你会发现很多聚合函数可以使用。您甚至可以对列进行加权,使其更喜欢一秒。我的函数在这两种情况下都取极端,因此最有价值的行在顶部。

很抱歉,如果有更简单的解决方案来完成这项工作,但我没有找到任何解决方案。

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

【讨论】:

天哪,你为什么要为这么简单的问题发布这样的代码。【参考方案5】:

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

ORDER BY article_rating DESC, article_time DESC

【讨论】:

4 年后接受的答案的副本如何获得这么多的赞成票? 可能是因为解释:P 已经有一个副本,有更好的解释。

以上是关于按两列对 MySQL 表排序的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中按两列对DataTable进行排序

根据两个不同表上的两列对完全连接进行排序

MySQL:按两列的函数排序

按两列排序,为啥不先分组呢?

使用 Doctrine 按多列排序

RDLC 在多列上排序