2017-09-27 69 views
0

表看起来是这样的mysql的分类名称和编号

ID | name 
---------------- 
1  | season 1 episode 1 
1  | season 1 episode 2 
1  | season 1 episode 3 
*  | * 
*  | * 
1  | season 1 episode 10 
1  | season 2 episode 1 
1  | season 2 episode 2 
1  | season 2 episode 3 
*  | * 
*  | * 
1  | season 2 episode 10 
2  | season 1 episode 1 
2  | season 1 episode 2 
2  | season 1 episode 3 
*  | * 
*  | * 
2  | season 1 episode 10 
*  | * 

而是试图以错误的顺序与

SELECT * FROM `episodes` ORDER BY `ID`, `name` DESC 

表排序10,11,12等,以解决这时候

+2

你需要规范化表...放入'name'成2列'season'和'episode' –

+2

...不要存放的话 '插曲',或'季节' – Strawberry

+0

为什么你将ID和名称存储在不同的列中? – Strawberry

回答

0

您看到此结果是因为它正在排序字符串,而不是整数。所以它分别检查每个字符。 10中的1被首先取出,并且因为1小于2,所以它在2之前排序它,即使当2自己发生时也是如此。只有到那时它才会移动到0上。它不知道你打算将它作为一个数字。而这只是在所有的工作,因为字符串的其余部分总是相同的长度。如果你开始有季节10等,它可能会变得更糟。

解决方法是将您的姓名字段分隔为两个整数字段 - “季节”和“情节”。只需填写相关的数字即可。通常情节有一个单独的描述性标题,你可以在字符串字段中保存,如果你有的话。

然后,您可以在查询中执行ORDER BY season, episode以使它们按正确顺序排列。如果您想要在当前名称字段中向用户显示文本,则可以在查询中执行类似SELECT "season" + CAST(season as CHAR(50)) + " episode " + CAST(episode as CHAR(50))的操作。

+1

我知道这个方法,我希望有更好的解决方案。以及什么是一些额外的工作。 – bog

+0

这是一项额外的工作,但它会为您提供更多的灵活性,从长远角度考虑如何使用您的数据。很高兴帮助你。反复存储“季节”和“情节”这个词也是多余的,因为它们纯粹是为了表示性的使用,而且你将数字存储为字符串,这会降低你搜索或计算数字的能力,正如这个问题所表明的那样。所以实际上这是对你的数据结构的改进,而不是一件苦差事:-) – ADyson

-1

试试这个

SELECT * FROM `episodes` ORDER BY `ID`, CHAR_LENGTH(`name`) 
+0

IMO,建议尝试一些东西应该在评论中给出。这应该如何正确地命令“第1季第1集”和“第1季第2集”? –