【问题标题】:How to display ascending or descending for the contents shown in mysql如何为mysql中显示的内容显示升序或降序
【发布时间】:2012-02-15 09:20:06
【问题描述】:

现在显示的输出:

1234/45/67-9
1234/45/67-8
1234/45/67-7
1234/45/67-6
1234/45/67-5
1234/45/67-4
1234/45/67-3
1234/45/67-22
1234/45/67-2
1234/45/67-10
1234/45/67-1
1234/45/67

需要输出:

1234/45/67-22
1234/45/67-10
1234/45/67-9
1234/45/67-8
1234/45/67-7
1234/45/67-6
1234/45/67-5
1234/45/67-4
1234/45/67-3
1234/45/67-2
1234/45/67-1
1234/45/67



SELECT invoiceNo
FROM invoice
WHERE invoiceNo LIKE '1234/45/67%'
ORDER BY invoiceNo DESC

我希望输出以降序显示,但无法以正确的方式显示?如何实现?

【问题讨论】:

    标签: mysql sql sql-order-by


    【解决方案1】:

    如果前缀总是 10 个字符长,那么您可以使用 substring 将其拆分,然后使用 cast 将第二个块转换为数字:

    select invoiceno
    from invoice
    where invoiceno like '1234/45/67%'
    order by substring(invoiceno from 1 for 10),
             cast(substring(invoiceno from 11) as decimal);
    

    将第二部分转换为数字可以让它们像数字而不是字符串一样排序,这样-10 就在-1 之前,而不是相反。如果您总是在 WHERE 子句中使用 9999/99/99 形式的前缀,那么您可以简化 ORDER BY:

    select invoiceno
    from invoice
    where invoiceno like '1234/45/67%'
    order by cast(substring(invoiceno from 11) as decimal);
    

    【讨论】:

    • 怀疑表是否包含数千行,是否需要更多时间来加载此查询???
    • @dude:substring 通话不是免费的。如果它变得太昂贵,那么您可能希望将 invoiceno 分成两个单独的列,以便您可以在不进行字符串争吵的情况下对它们进行排序。
    • 如何实现呢?如果我遇到这样的问题
    • @dude:为发票编号的两部分添加两个新列,在 INSERT 上将 in oice 编号分成两部分,然后根据需要order by part1, part2。基本上,您会预先计算 substring 调用,而不是每次排序时支付计算费用。
    【解决方案2】:

    使用辅助计算字段转换为integer,如下所示:

    SELECT invoiceNo, CAST(SUBSTR(invoiceNo FROM 11) AS INT) AS invoiceNumber
    FROM invoice
    WHERE invoiceNo LIKE '1234/45/67%'
    ORDER BY invoiceNumber DESC
    

    【讨论】:

      【解决方案3】:

      试试这个查询 -

      SELECT * FROM (
        SELECT invoiceNo,
          @third_part:=SUBSTRING_INDEX(invoiceno, '/', -1) tp
        FROM
          invoice
        WHERE
          invoiceNo LIKE '1234/45/67%'
        ) t
      ORDER BY
        SUBSTRING_INDEX(tp, '-', 1) * 1 DESC,
        IF (LOCATE('-', tp) = 0, 0, SUBSTRING_INDEX(tp, '-', -1) * 1) DESC
      

      【讨论】:

        【解决方案4】:

        试试这个查询

        SELECT invoiceNo
        FROM invoice
        ORDER BY cast(substring(invoiceNo from 11) as decimal) ASC
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-16
          • 2018-09-15
          • 2020-12-26
          • 1970-01-01
          • 1970-01-01
          • 2012-02-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多