【问题标题】:How to order a vertical table by column value?如何按列值对垂直表进行排序?
【发布时间】:2018-09-15 15:07:44
【问题描述】:

我有一个有 4 列的表格:

id | m_id | name | value
--------------------
 1 | 1    | bed  |   3
 3 | 1    | bath |   3
 2 | 2    | bed  |   4
 3 | 2    | bath |   2

我想使用value 对结果进行排序,并保持m_id 的顺序。

如果我从name 列按bed DESC 订购,结果应如下所示:

id | m_id | name | value
--------------------
 2 | 2    | bed  |   4
 3 | 2    | bath |   2
 1 | 1    | bed  |   3
 3 | 1    | bath |   3

如果我从name 列中按bath DESC 订购,结果应如下所示:

id | m_id | name | value
--------------------
 1 | 1    | bed  |   3
 3 | 1    | bath |   3
 2 | 2    | bed  |   4
 3 | 2    | bath |   2

无论name 的顺序是否发生变化,我只关心m_id 是否保持顺序。

有什么想法吗?

【问题讨论】:

  • 为什么不能使用 ORDER BY value, m_id?
  • 因为m_id 不正常
  • 我认为你可以使用类似:select id,m_id,name,value from table order by m_id,value
  • ORDER BY bed DESC 是什么意思? bed 不是列名,它是某些行中的值。
  • 你说你想保持m_id的顺序。为什么m_id 在第一个结果中升序,而在第二个结果中降序?

标签: mysql sql sorting select sql-order-by


【解决方案1】:

您可以在order by 中使用子查询。这有点酷:

select t.*
from t
order by (select max(t2.value) from t t2 where t2.m_id = t.m_id) desc, m_id;

当然,这可以更传统地使用joingroup by 来完成:

select t.*
from t join
     (select t2.m_id, max(t2.value) as max_value
      from t t2
      group by t2.m_id
     ) t2
     on t.m_id = t2.m_id
order by t2.max_value desc, m_id;

【讨论】:

  • 你从那个问题中解读出他想要什么? :)
【解决方案2】:

这只是一个疯狂的猜测,因为我无法 100% 真正理解您的问题。我认为您想重新调整行值,以便对每一列进行排序,对吗?你想要这样的东西吗?

id | m_id | name | value
--------------------
 1 | 1    | bath |   2
 2 | 1    | bath |   3
 3 | 2    | bed  |   3
 3 | 2    | bed  |   4

每列都已排序,但行不再有意义。

如果是这样,我必须告诉你 SQL 不能以任何简单的方式做到这一点。您最好使用 SQL 从表中获取数据,然后使用您的自定义编程语言随意重新排列。

【讨论】:

  • 这相当于像id | m_id | bath | bed 这样的表。在这种情况下,它将有两行。我可以按bathbed 或两者排序。碰巧我的桌子是垂直的。我可以使用类似 `ORDER BY FIELD (slug, 'bath')` 之类的东西。由于某种原因,我无法保留 m_id in order
  • 但是,是的,你是对的,我可能需要使用一些编程语言来做进一步的排序。
【解决方案3】:

在您的查询中尝试以下 order by 子句。 order by decode(name,'bed',1,'bath',2), m_id

根据需要设置 asc,desc。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多