2010-04-10 80 views
3

我有一個藝術家,專輯和曲目列表,我想用它們各自名稱的第一個字母排序。當我想忽略「The」,「A」,「An」和其他各種非字母數字字符(與您對話「奇怪的Al」揚科維奇和[對話])時,問題就會到來。 Django有一個很好的開始'^(An?| The)+',但我想忽略那些和我選擇的其他幾個人。匹配第一個字母數字字符跳過(The | An?)

我這樣做是在Django中,使用一個MySQL數據庫與utf8_bin整理。

編輯

那麼我沒有提及這一點,但數據庫我訪問故障是非常俱備只。它是由Amarok創建和維護的,我不能在沒有一堆問題的情況下改變它。這是說藝術家表有The Chemical Brothers列爲The Chemical Brothers所以我認爲我卡在這裏。這可能會很慢,但這不是我個人關心的問題,因爲這是個人項目。

+1

提供更多信息。你想在哪裏進行分類?在SQL或Python?你想丟棄這些條目,還是隻有前綴? – 2010-04-10 20:52:12

+2

我個人會創建一個名爲「prefix」的列,然後遍歷每一行並分離出前綴(如果有的話)。然後在「名稱」列上排序 - 不管它是什麼。你總是可以將名字拼湊在一起。像pi一樣容易。 – 2010-04-10 20:53:30

+0

@Hamish我無法改變數據庫。我可能會拉出值使用Django的__regex相當於'WHERE title REGEXP'^(一個?| the)+';'或者沿着這些線。 – TheLizardKing 2010-04-10 22:00:44

回答

3

你所要求的可能不是你所需要的。你可能不想按照第一個字母排序。如果第一個字母是相同的,那麼你通常也會想看第二個字母等。當你按藝術家排序時,這將導致同一個藝術家的所有歌曲被分組在一起。

更新答案

你說你不能更改數據庫。然後,您可以使用TRIM(LEADING ... FROM ...)去除不感興趣的單詞,但請注意,由於查詢無法在列上使用索引,因此這將會很慢。

SELECT * 
FROM song 
WHERE SUBSTRING(TRIM(LEADING 'The ' FROM TRIM(LEADING 'A ' FROM title)), 1, 1) = 'B' 
ORDER BY TRIM(LEADING 'The ' FROM TRIM(LEADING 'A ' FROM title)) 

結果:

 
'The Bar' -- "The" is ignored when sorting. 
'Baz A'  

測試數據:

CREATE TABLE song (title NVARCHAR(100) NOT NULL); 
INSERT INTO song (title) VALUES 
('The Bar'), 
('Baz A'), 
('Foo'), 
('Qux'), 
('A Quux'); 

原來的答案

還要注意的是,如果你ORDER BY列的函數當您有大量記錄時,它將非常慢,因爲該列上的索引無法使用。相反,您應該存儲另一列,您可以刪除所有不感興趣的單詞(,等等),然後按該列排序。您可以在插入行時從應用程序插入到該列中,或者在數據庫中使用觸發器。

+0

Woo-hoo,至少+1我以前的評論。 – 2010-04-10 21:00:34

+2

@Hamish:我沒有看到你的評論,我會+1。是的'artist_prefix'和'藝術家'專欄將工作,並避免重複數據庫中的數據。你爲什麼不把它作爲答案提交?然後我會看到它併爲它+1。我不認爲StackOverflow會在你寫答案時發佈評論,但是如果有人發佈答案,它會(有時)發佈評論。 – 2010-04-10 21:07:07

+0

我的錯是我的錯,我沒有提及,顯然我應該,這個數據庫是隻讀的,我不能改變它。我有三張桌子,曲目,藝術家和專輯。當我搜索C時搜索W和The Chemical Brothers時,我只需要返回「Weird Al」。 – TheLizardKing 2010-04-10 22:03:54

0

在PostgreSQL,我發現這是開始使用的那種分類的一個很好的方式:

SELECT title 
FROM albums 
ORDER BY  
    CASE 
    WHEN title ~* '^The ' THEN substring(title from 5) 
    WHEN title ~* '^An ' THEN substring(title from 4) 
    WHEN title ~* '^A ' THEN substring(title from 3) 
    ELSE title 
    END asc; 

我猜想,MySQL有類似的小動物。

相關問題