如何为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 命令如何让查询结果按时间升序或降序排序?