2012-02-15 83 views
2
现在显示

输出:如何显示升序或降序对MySQL的显示内容

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 

我想在下降中显示的输出,但它不能以适当的方式展示?如何实现它?

回答

2

如果前缀始终是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); 
+0

如果表中包含数千行,则会怀疑是否需要更多时间才能加载此查询? – dude 2012-02-16 05:14:22

+0

@dude:'substring'调用不是免费的。如果它变得太贵,那么你可能会想将'invoiceno'分成两个单独的列,这样你就可以在没有字符串争吵的情况下对它们进行排序。 – 2012-02-16 05:24:06

+0

如何实现它?如果我面临这样的问题 – dude 2012-02-16 08:15:26

1

使用的辅助计算领域投地integer,像这样:

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

尝试此查询 -

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 
0

尝试此查询

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