使用mysql订购列名

时间:2017-04-06 03:47:44

标签: mysql

我刚刚进入这个名为CodeFights的网站,为开发人员提供了挑战。我想问一下堆栈溢出的可爱的人可能会通过MySql挑战引导我朝着正确的方向前进。 首先它给出了一个描述,如果这个link对你有用,也许你可以帮我解决这个问题,因为输入需要很长时间。

如果不是,我对50%问题的回答很简单: 从book_chapters中选择chapter_name;

它还要求您按照ASCENDING顺序订购章节名称并且我已尝试过 通过chapter_number ASC从book_chapter顺序中选择chapter_name; 但没有运气, 他们只需要book_chapters中的一列及其chapter_name。

有点难过。

1 个答案:

答案 0 :(得分:1)

一种方法是将罗马数字转换为阿拉伯语(基数10)表示。

但这并不是必需的。

一系列简单的字符串替换就可以解决问题。

在罗马数字和#34;数字"的排名方面......

    I < V < X < L < C < D < M

如果我们更换&#39; L&#39;用&#39; Y&#39;和&#39; C&#39;与&#39; Z&#39;和(现在)我们忽略&#39; D&#39;和&#39; M&#39;然后这个字符串比较将成立:

    'I' < 'V' < 'X' < 'Y' < 'Z'  

这里的技巧是我们选择特定整理顺序中的替换字符,以便我们可以进行排序。

我们要处理的另一个问题是&#34;减法&#34;的特殊情况。 (向后)替换

    IV
    IX
    XL
    XC

如果我们用具有四个重复字符的表示替换这些情况......即IV - &gt; IIIIIX - &gt; VIIII等等,然后获取可以排序的字符串值。

所以,我们可以使用这样的ORDER BY子句:

  ORDER BY REPLACE(
             REPLACE(
               REPLACE(
                 REPLACE(
                   REPLACE(
                     REPLACE(
                       UPPER( chapter_num ) 
                     ,'C','Z')
                   ,'L','Y')
                 ,'IV','IIII')
               ,'IX','VIIII')
             ,'XY','XXXX')
           ,'XZ','YXXXX')

这适用于罗马数字值高达399.当我们遇到“D&#39;”时。

要处理400或更高的数字,我们可以将'D'替换为字符&#34;大于&#34;整理顺序中的'Z',例如左方括号'['。我们可以使用右方括号'M'替换']'。并针对特殊情况'CD''CM'进行适当的替换。

我们需要验证字符串的整理顺序,这是正确的:

    'I' < 'V' < 'X' < 'Y' < 'Z' < '[' < ']'

然后我们可以扩展对超过399的罗马数字的支持......

  ORDER BY REPLACE(
             REPLACE(
               REPLACE(
                 REPLACE(
                   REPLACE(
                     REPLACE(
                       REPLACE(
                         REPLACE(
                           REPLACE(
                             REPLACE(
                               UPPER( chapter_num )
                             ,'M',']')
                           ,'D','[')
                         ,'C','Z')
                       ,'L','Y')
                     ,'IV','IIII')
                   ,'IX','VIIII')
                 ,'XY','XXXX')
               ,'XZ','YXXXX')
             ,'Z[','ZZZZ')
           ,'Z]','[ZZZZ')