【问题标题】:Sort mysql result. order by col1, group by col2排序mysql结果。按 col1 排序,按 col2 分组
【发布时间】:2019-01-26 06:12:02
【问题描述】:

我有一个包含 2 列“id”和“name”的表。 id 是常规的自增索引,name 只是 varchar。

id  name
1  john
2  mary
3  pop
4  mary
5  john
6  michael
7  john
8  will

我想像这样对搜索结果进行排序

8  will
7  john
5  john
1  john
6  michael
4  mary
2  mary
3  pop

ID 是 DESC,但所有重复的名称都归为一组。没关系,如果 ASC 更容易实现。如有必要,我可以在 PHP 中反转结果。

Regular ORDER BY name,id DESC 先对所有的名字排序,再对id的排序。那不是我想要的。我对名称的字母顺序不感兴趣。

我想要按 DESC 顺序排列的 id,如果有的话,按重名分组。

附言很抱歉,这是一个重复的问题。

【问题讨论】:

  • 在您的结果 id 中是 not DESC
  • 在 SQL 中 ORDER BY 将通过一一比较结果行来对它们进行排序。由于您想要的结果中5 john 的位置取决于7 john 的位置,这将不起作用。我担心没有一个关系结构可以满足您的要求。
  • @Alma Do Mundo:你是对的。 ID 并不是按 DECS 顺序排列的。但是有一个全局DECS订单(8,7,6,4,3)和一组本地DECS订单(7,5,1)(4,2)

标签: mysql sql-order-by


【解决方案1】:

如果我对您的理解正确,您将需要一个临时表。

SELECT TableName.id, TableName.Name FROM TableName
INNER JOIN 
(
    SELECT Name, max(id) as maxid FROM TableName GROUP BY Name
) as tmp on tmp.Name = TableName.Name
ORDER BY maxid DESC, id DESC

【讨论】:

  • 我把 WHERE 子句放在 INNER JOIN 和 ORDER BY 之间。它有效:) 谢谢。
【解决方案2】:

mysql中有group by子句,见select,在页面搜索group by。

页面上有例子

所以试试这个...

SELECT id, name FROM TableName
group BY name;

由于您的 ID 充当您的主键,您可能不需要告诉它按升序排序,但您可以添加

order by id

如果你愿意的话。

当然,group by 子句也可以添加 ASC 和 DESC 子句,因此如果需要,您应该按字母顺序获取它们。

虽然,那说只是使用一个

order by desc(name)

可能会给您类似的结果,您需要在数据集上对其进行测试。

请注意,这可能是一个非常昂贵的选择,因为它会尝试将所有内容分类到您需要的顺序中。 因此,如果您希望将其用作其他选择的基础,您可以决定创建一个临时表,然后您可以直接选择该表,否则每次使用主表时可能会重新发生分组。 一旦您的数据集变得相当大,这可能是您想要考虑的事情。 大卫

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 2016-03-02
    相关资源
    最近更新 更多