【问题标题】:SQL order by same values only insteading of alphabetic orderSQL 仅按相同值排序,而不是字母顺序
【发布时间】:2021-03-24 22:08:01
【问题描述】:

假设我有这样一张桌子:

  Order_ID  |  Box_ID  |  Item_ID
------------------------------------
      B     |    1     |     b
      B     |    2     |     b
      A     |    2     |     a
      A     |    3     |     a
      A     |    4     |     a

现在,当我按订单 ID 订购表格时,

SELECT * FROM table ORDER BY Order_ID, Box_ID;

结果将如下所示:

  Order_ID  |  Box_ID  |  Item_ID
------------------------------------
      A     |    2     |     a
      A     |    3     |     a
      A     |    4     |     a
      B     |    1     |     b
      B     |    2     |     b

但是现在,我希望 sql 语句首先考虑将 Box_ID 的相同值放在一起, 这样结果将如下所示:

  Order_ID  |  Box_ID  |  Item_ID
------------------------------------
      A     |    2     |     a
      B     |    2     |     b
// despite order_ID being B, but box_ID is equal to previous value, so group together
      A     |    3     |     a
      A     |    4     |     a
      B     |    1     |     b

但是下面的代码,

SELECT * FROM table ORDER BY Box_ID, Order_ID

将产生以下结果,因为它首先按字母顺序列出 Box_ID。

  Order_ID  |  Box_ID  |  Item_ID
------------------------------------
      B     |    1     |     b
      A     |    2     |     a
      B     |    2     |     b
      A     |    3     |     a
      A     |    4     |     a

如何输出我想要的结果?

【问题讨论】:

  • 我们从哪一列知道Box_ID 2 行在前?表格本质上是无序的

标签: mysql sql sql-order-by


【解决方案1】:

我想你想要:

order by min(order_id) over(partition by box_id), box_id

在早期版本中,您可以使用子查询:

select *
from mytable t
order by
    (select min(order_id) from mytable t1 where t1.box_id = t.box_id),
    box_id

【讨论】:

  • 好的。似乎我们的 MySQL 服务器不支持 OVER 子句。我可以采用其他替代方案吗?
  • @IncrediblyHandSomeSamuel:查看我的更新。
【解决方案2】:

在 MySQL 的 order 版本中,您可以使用相关子查询:

select t.*
from table t
order by (select min(t2.order_id) from table t2 where t2.box_id = t.box_id),
         box_id;

【讨论】:

    【解决方案3】:

    如果您希望Box_ID 出现次数最多的行位于顶部,则需要此查询:

    SELECT Box_ID, COUNT(*) counter
    FROM tablename
    GROUP BY Box_ID
    

    像这样加入表格:

    SELECT t.*
    FROM tablename t
    INNER JOIN (
      SELECT Box_ID, COUNT(*) counter
      FROM tablename
      GROUP BY Box_ID
    ) g ON g.Box_ID = t.Box_ID
    ORDER BY g.counter DESC, Order_ID, Box_ID
    

    请参阅demo
    结果:

    > Order_ID | Box_ID | Item_ID
    > :------- | -----: | :------
    > A        |      2 | a      
    > B        |      2 | b      
    > A        |      3 | a      
    > A        |      4 | a      
    > B        |      1 | b 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-16
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      相关资源
      最近更新 更多