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

时间:2013-12-02 08:31:18

标签: mysql sql sorting

我有两列,名为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 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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 演示