2009-03-30 2 views
8

Ich habe eine Liste von Filmen, die ich nach Buchstaben gruppiert habe. Natürlich haben die Filme, die mit dem Buchstaben "T" beginnen, ungefähr 80% der Filme, die mit "The" beginnen. Filme wie "The Dark Knight" sollten in der "D" -Liste und vorzugsweise auch im "T" erscheinen. Kann ich das irgendwie machen?Wie ordnen Sie nach Titel in mysql, das Wort "das" ignorierend?

Ich verwende den folgenden Code in der WHERE-Klausel, um Filme anzuzeigen, die mit einem bestimmten Buchstaben beginnen, "the" ignorierend, aber dies hatte auch einen praktischen Nebeneffekt, einen Film wie "The Dark Knight" für Buchstaben erscheinen zu lassen "D" und "T".

WHERE movie_title REGEXP CONCAT('^(the)?', '$letter') 

Ich möchte dies erreichen, wenn ich alle Filme ausspreche, die in der Datenbank sind.

+1

Um einen Schraubenschlüssel in die Gleichung zu werfen: Titel, die mit Zahlen beginnen ("101 Dalmations") sollen sortiert werden, als wäre die Zahl ausgeschrieben. In diesem Fall unter "O". –

Antwort

18

Wenn Sie diese Abfrage häufig durchführen, sollten Sie in der Tabelle ein separates Feld mit dem Namen "Sortiert" erstellen. Die Verwendung von regulären Ausdrücken oder anderen Operationen macht es für MySQL unmöglich, den Index zu nutzen.

Also, die einfachste und effizienteste Lösung ist, fügen Sie ein movie_title_short Feld, das movie_title ohne die "The" oder "A" enthält. Stellen Sie sicher, dass Sie dem Feld movie_title_short einen Index hinzufügen!

+0

Yah ich dachte darüber nach, aber nein, es wird nicht viel ausgeführt werden. –

+0

Speicherplatz ist billiger als CPU-Zeit. Verwenden Sie einfach ein title_order-Feld, da Sie zweifellos nach denselben Kriterien sortieren möchten. – cletus

+0

Das Hinzufügen eines separaten Felds löst auch nicht das Problem, denselben Film in der "T" - und anderen Buchstabenliste anzuzeigen. –

1
select right(movie_title, char_length(movie_title)-4) as movie_title 
from movies 
where left(movie_title,3) = 'the' 
union 
select movie_title 
from movies 
1

Sie die MySQL-Ersetzen-Funktion in der select-Klausel verwenden können ...

select replace(movie_title,'The ','') from ... order by replace(movie_title,'The ','')' 
+0

Nein, er möchte, dass "The" -Filme zweimal erscheinen, wenn sie alle zusammen abgeladen werden - mit und ohne "the". – GSerg

+0

Es wird, wenn Sie die gleiche WHERE-Klausel verwenden. Kannst du -1 Kommentare? :) – ashawley

6

Wie Carl sagte, würde ich dies in die eigene Wendefeld bauen zu vermeiden, ist es jedes Mal zu berechnen, die . Ich würde empfehlen, es auf eine etwas andere Art und Weise zu tun, um Redundanz zu vermeiden.

movies (id, name, namePrefix) 

zB:

| Dark Knight  | The | 
| Affair To Remember | An | 
| Beautiful Mind  | A | 

diese Weise können Sie diese Filme auf zwei verschiedene Arten zeigen: "name, namePrefix" oder "namePrefix name" und können entsprechend sortiert werden.

+0

Weiß jemand, ob es eine kanonische Liste von Wörtern gibt, um Titel beim Sortieren auszusortieren, wie "The", "An" und "A". Auch Regeln für die Kapitalisierung: Sollte es "eine Affäre zum Erinnern" oder "eine Affäre zum Erinnern" sein? – Evan

0

verwenden:

SELECT * FROM movies ORDER BY TRIM(LEADING 'the ' FROM LOWER(`movie_title`)); 
1

nur, dass Problem selbst hatte ... Lösung:

SELECT * FROM movies WHERE title REGEXP '^d' AND title NOT REGEXP '^the ' OR title REGEXP '^the d' 

dies wird Ihnen nur Ergebnisse, die mit "The D" beginnt oder "D"

Verwandte Themen