首页 文章

MYSQL:按2列排序,具有相似的数据

提问于
浏览
0

我有2列,名为GenreID,和CustomGenre(指的是一本书的类型) . GenreID是一个整数,它指的是在名为GenreName的colume中的不同表中列出的类型 . CustomGenre允许用户输入自己的文本,如果他们不喜欢任何预定义的选项,或者他们想要添加更多信息,如子类 .

我希望能够做的是按字母顺序排序,优先选择GenreName . 因此,如果行具有GenreID,则它将按GenreName排序 . 如果该行没有GenreID(或者它为零),则CustomGenre被视为GenreName,因此我最终得到一个列表,如果我显示“GenreName,CustomGenre”,它实际上按字母顺序排列,即使row没有引用任何GenreName .

如果不清楚,这里有一个小例子:

Genre:
GenreID  GenreName
1        Sci-Fi
2        Fantasy
Books:
Book           GenreID   CustomGenre
Example        1          Futurism
A Book         2 
Another Book!             Horror

而且我希望那些像这样排序,第二列是alphebetized:

Results:
Book            GenreName + CustomGenre
A Book            Fantasy
Another Book!     Horror
Example           Sci-fi, Futurism

谢谢!

3 回答

  • 0

    您需要使用CONCAT函数 .

    试试这个:

    SELECT
        b.Book,
        CONCAT( b.CustomGenre, g.GenreName) as the_genre
    FROM 
        Books b
    LEFT JOIN Genre g
        ON b.GenreID = g.GenreID
    ORDER BY
        the_genre
    
  • 0

    你可以这样试试

    SELECT book, TRIM(BOTH ', ' FROM 
                      CONCAT(COALESCE(g.genrename, ''), ', ',
                             COALESCE(b.customgenre, ''))) genre
      FROM book b LEFT JOIN genre g
        ON b.genreid = g.genreid
     ORDER BY COALESCE(g.genrename, b.customgenre)
    

    输出:

    |          BOOK |            GENRE |
    |---------------|------------------|
    |        A Book |          Fantasy |
    | Another Book! |           Horror |
    |       Example | Sci-Fi, Futurism |
    

    这是 SQLFiddle 演示

  • 0

    试试这个:

    SELECT Book, 
       CONCAT(IFNULL(GenreName,""), IF(GenreName IS NOT NULL, ", ", ""), IF(CustomGenre = "", "", CustomGenre)) As BookGenre
    FROM Books LEFT OUTER JOIN Genre
    ON Books.GenreID = Genre.GenreID
    ORDER BY BookGenre
    

    工作演示:http://sqlfiddle.com/#!2/ebe73/23

相关问题