2010-04-10 84 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有类似的小动物。

相关问题