2017-09-27 22 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集」? –