如何为mysql中显示的内容显示升序或降序

Posted

技术标签:

【中文标题】如何为mysql中显示的内容显示升序或降序【英文标题】:How to display ascending or descending for the contents shown in 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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何为mysql中显示的内容显示升序或降序的主要内容,如果未能解决你的问题,请参考以下文章

linux 中 ll 命令如何让查询结果按时间升序或降序排序?

python:argsort,将数组升序或降序,将矩阵每一行升序或降序,返回其索引

按升序或降序对数字或字母进行通用排序

SQL Server 索引 - 升序或降序,有啥区别?

采用冒泡算法对数组进行升序或降序排序

用 C++ 在给定的未排序序列中找到第一个最长的升序或降序子序列