【问题标题】:Single mysql select on one table, but sort a column twice both ASC and DESC?一个表上的单个 mysql 选择,但是 ASC 和 DESC 对列进行两次排序?
【发布时间】:2014-02-17 02:31:21
【问题描述】:

我有一张已下订单的表格。它们带有时间戳。一些订单也被标记为优先订单。

非优先订单以先进先出方式成交 - 最早成交的订单先成交,较新的订单排在最后。

但是,可以有优先顺序。这些有一个简单的 bool '1' 来标记为优先级。但问题是,它们是反向填写的——较新的优先级订单会推回较旧的优先级订单。所以这些时间戳是按 DESC 排序的,而不是升序的。

我基本上需要一个像这样工作的选择:(我知道这是无效的,我试图展示我想要实现的目标)

SELECT * 
FROM table 
ORDER BY priority DESC, 
(if priority = 1 order by timestamp DESC else order by timestamp)

我尝试过合并两个选择,但这些选择会丢失排序。我尝试了 (SELECT) UNION (SELECT) ORDER BY,但我需要两个不同的选择以不同的方式排序。

没有做两个单独的选择 - 这可能吗?我想不通。

【问题讨论】:

    标签: mysql sorting


    【解决方案1】:

    可能这样的事情会起作用

    SELECT * 
    FROM tab ORDER BY    
    (CASE WHEN 
     (priority = 1) THEN
            'timestamp DESC'
        ELSE
            'timestamp'
        END), priority DESC ;
    

    在此处查看演示小提琴http://sqlfiddle.com/#!2/3ce7f/3

    【讨论】:

    • 没有。这不是 OP 所期望的。
    • 怎么回事?查看他发布的查询(他尝试过的)SELECT * FROM table ORDER BY priority DESC, (if priority = 1 order by timestamp DESC else order by timestamp。在这种情况下,发布的查询是错误的!
    • 你的答案不会被编译。
    • 是的,出现了一些错误。现在它会的。
    • 这似乎仍然不起作用。当我运行它时,整个案例似乎不起作用。我有一个样本表,两列,“字母”和“优先级”。它有 9 行,a、b、c、d、e、f、g 和 h。 b、e 和 g 行的优先级为 1。使用此:
    【解决方案2】:
    SELECT * FROM orders 
    ORDER BY 
    CASE WHEN priority = 1 THEN 'timestamp DESC' ELSE 'timestamp ASC' END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多