如何按列值排序垂直表?

时间:2018-04-05 17:40:20

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

我有一个包含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

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

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

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

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

无论name订单是否发生变化,我都只关心m_id按顺序排列。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您可以在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;

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

在您的查询中尝试以下order by子句。 通过解码订单(名称,'床',1,'浴室',2),m_id

根据您的需要设置asc,desc。