mysql命令字符串作为数字

时间:2012-12-18 13:48:04

标签: mysql string numbers

我已经搜索了几天在mysql中将字符串排序为数字的方法。

我的行看起来像这样:

order_column

1.1.2
1.1.100
1.1.1

在mysql中按此列升序排序将产生:

1.1.1
1.1.100
1.1.2

我有兴趣获得以下结果:

1.1.1
1.1.2
1.1.100

有没有办法使用SQL生成此结果?

我的专栏的其他可能值:

28.1999.1.1
1
1.1.154.20
100.1.1.1.1.15

谢谢,我感谢每个人的时间。

编辑: Fast Relational method of storing tree data (for instance threaded comments on articles) 看看第一个答案,Ayman Hourieh的答案。我正在尝试让该解决方案正常运行。我的网站每篇文章的评论不超过10k,所以我找到了这样的解决方法:

000001
000002
000002.000001
000002.000001.000001
000002.000002
000002.000003
000003

基本上,在我的评论计数器之前放置零,以便字符串比较不会失败。但这只适用于99999评论。我可以添加更多的零,让我们说10个零,这将适用于999999999评论,但我希望有一个更优雅的解决方案。

10 个答案:

答案 0 :(得分:3)

如果字符串不太长,你可以

ORDER BY cast(replace(your_column_name,'.','') as unsigned);

答案 1 :(得分:2)

你将无法有效地执行此操作,因为 这将错过所有索引 ,但如果它是一次性的,这将有效。遗憾的是,由于MySQL无法(我知道)无法一次替换多个角色,因此看起来很糟糕。

SELECT value FROM TEST ORDER BY 
   REPLACE(
    REPLACE(
      REPLACE(
        REPLACE(
          REPLACE(
            REPLACE(
              REPLACE(
                REPLACE(
                  REPLACE(value, 
                    '1', '0'),
                  '2', '0'), 
                '3', '0'), 
              '4', '0'), 
            '5', '0'), 
          '6', '0'), 
        '7', '0'), 
      '8', '0'), 
    '9', '0'),value;

它基本上会用0替换所有数字,然后按顺序替换。由于.在0之前订购,因此它将按数字组正确排序。完成后,只需按值排序,因为具有相同数字组的任何值都应以正确的顺序排序。

为了提高效率,您可以将替换后的值存储为数据库中的列,以便对其进行索引。

SQLfiddle demo here

答案 2 :(得分:1)

SELECT INET_ATON('10.0.5.9');

在你的尝试中使用此功能:)

也许这不是替代品,因为它只适用于IP地址类型。而且你确实拥有比IP地址更多的部分。

答案 3 :(得分:1)

这不会有效并且可以清理,但是如何做到这一点是一个想法。它依赖于一个名为整数的表,其中一列名为i,其中包含10行,值为0到9。

SELECT somefield    , SUM(POW(100, occurrences - anInteger) * somefield_split) OrderField
FROM
    (SELECT id,anInteger,  somefield, SUBSTRING_INDEX(SUBSTRING_INDEX(somefield, ".", anInteger), ".", -1) AS somefield_split, LENGTH(somefield) - LENGTH(REPLACE(somefield, '.', '')) + 1 AS occurrences
    FROM splittertest, (SELECT a.i*10+b.i AS anInteger FROM integers a, integers b) Sub1
    HAVING occurrences >= anInteger) Sub2
GROUP BY somefield
ORDER BY somefield, OrderField

想法是subselect获取一个从0到99的数字范围,并根据此分离字符串的点分隔值。它获取特定字符串中的点数。然后它将字符串的每个位乘以100,得到总节数减去此节的数量的幂,并在此基础上求和。

所以5.10.15分为5,10和15.有3个部分,所以第一个乘以100到(3 - 0)的幂,第二个乘以100到(2 - 0的幂) )等等。

如果点数变化(即点数更多的点总是更大),这确实会产生奇怪的结果,但这可以通过在计算功率时使用任意线上的最大点数来修复,而不是而不是该特定线上的点数。

祝你好运!

答案 4 :(得分:0)

创建一个与此列相等的新列,其字符串替换为“。”用''(没什么)。将此新字段存储为数字。请在此字段中订购,而不是在您的查询中。

如果你不能在表格中添加新列,你可以在PHP等处理它,以达到相同的效果,例如在网站上显示。

http://php.net/manual/en/function.str-replace.php

答案 5 :(得分:0)

您可以使用以下sql

SELECT REPLACE(column_name,'.','') AS column_name1 FROM table_name ORDER BY column_name1;

答案 6 :(得分:0)

如果您按最后一个数字组排序,那么

SELECT CAST(MID(order_column, 
CHAR_LENGTH(order_column) - 
LOCATE('.',REVERSE(order_column))+2) AS DECIMAL) AS order_column_as_number
FROM thetable 
ORDER BY order_column_as_number

似乎有效。

如果没有'。'的字符串,根本不起作用。在它们中,如果你想要由其他组订购,你将不得不提取更多的零件,但如果你真的希望它只在sql中完成,那么这可能是一个开始。

答案 7 :(得分:0)

确保这些数字的列是INT而不是varchar。

如果你使用varchar,那么你的列将被那些首先拥有1的人排序......依此类推......

答案 8 :(得分:0)

这是我的解决方案,用于最多包含4个小数的数字:

SELECT myCol, SUBSTRING_INDEX(myCol, ',', 1) * 10000 + LEFT(CONCAT(SUBSTRING_INDEX(myCol, ',', -1), '0000'), 4) as toOrder 
FROM `myTable`
ORDER BY toOrder DESC

您可以像这样用小数点后8位来表示:

SELECT myCol, SUBSTRING_INDEX(myCol, ',', 1) * 100000000 + LEFT(CONCAT(SUBSTRING_INDEX(myCol, ',', -1), '00000000'), 8) as toOrder 
FROM `myTable`
ORDER BY toOrder DESC

等...

答案 9 :(得分:0)

先通过INSTR进行订购,然后通过替换“。”进行订购。

SELECT content_id FROM TEST ORDER BY INSTR(`content_id`, '.'), replace(`content_id`,'.','')

SQLfiddle