2009-08-17 2 views
15

Ich versuche, eine Liste von Titeln zu sortieren, aber derzeit gibt es einen riesigen Block von Titeln, die mit 'The' beginnen. Ich möchte, dass das "The" ignoriert wird, und die Art, das zweite Wort abzuarbeiten. Ist das in SQL möglich, oder muss ich am Frontend arbeiten?Benutzerdefinierte ORDER BY ignorieren 'die'

Zum Beispiel aktuelle Sortierung:

  • Flugzeug
  • Children of Men
  • Full Metal Jacket
  • Pulp Fiction
  • Der Brunnen
  • The Great Escape
  • Die Königin
  • Zardoz

besser sortiert wäre:

  • Flugzeug
  • Children of Men
  • Der Brunnen
  • Full Metal Jacket
  • The Great Escape
  • Pulp Fiction
  • Die Königin
  • Zardoz

Fast so, als wenn die Datensätze als ‚Brunnen, der‘ gespeichert wurden, und dergleichen. Aber ich möchte sie nicht so speichern, wenn ich kann, was natürlich der Kern des Problems ist.

+1

Vielen Dank für die Erinnerung an Zardoz. Jetzt werde ich Alpträume über schwebende Köpfe haben. – MusiGenesis

+0

Ich bin froh, dass jemand das gefangen hat: D – dimo414

+0

Jetzt, Full Metal Jacket, gibt es einen tollen Film. Oder wie ich zu meinen Daten sagen möchte: "Ich bin ... in einer Welt ... von $ #! +". – MusiGenesis

Antwort

12

Am besten ist es, eine berechnete Spalte zu haben, damit Sie die berechnete Spalte und Reihenfolge damit indizieren können. Sonst wird die Art viel Arbeit sein.

So können Sie Ihre berechnete Spalte haben, wie:

CASE WHEN title LIKE 'The %' THEN stuff(title,1,4,'') + ', The' ELSE title END 

Edit: Wenn STUFF nicht verfügbar in MySQL ist, dann rechts oder SUBSTRING verwenden, um die führenden 4 Zeichen zu entfernen. Versuchen Sie jedoch nach Möglichkeit, eine berechnete Spalte zu verwenden, damit die Indexierung besser sein kann. Dieselbe Logik sollte für das Auslesen von "A" und "An" gelten.

Rob

+2

Sie möchten möglicherweise auch alle Kleinbuchstaben in der Sortierspalte machen, um Groß- und Kleinschreibung Sortierungen (und sucht) – Thilo

+1

Ja, wenn Sie eine Groß-und Kleinschreibung beachten. Aber ich stelle mir vor, dass der Fall als Filmtitel wahrscheinlich in der Eingabe gesteuert wird, so dass Sie nicht den Leistungseinschlag haben müssen, um Datensätze auf der Grundlage ihres Kleinbuchstabenäquivalents zu finden. –

4

denke ich, Sie so etwas wie

ORDER BY REPLACE(TITLE, 'The ', '') 

tun könnte, obwohl dies alle Vorkommen ersetzen würde von ‚Die‘ mit ‚‘, nicht nur die erste ‚Die‘, obwohl ich nicht glaube, dies sehr beeinträchtigen würde viel.

+0

Nun, ich mag meine Idee auch nicht, aber erkläre zumindest, ob es nicht die beste Lösung ist oder ob es nicht einmal läuft. – MusiGenesis

9

Etwas wie:

ORDER BY IF(LEFT(title,2) = "A ", 
      SUBSTRING(title FROM 3), 
      IF(LEFT(title,3) = "An ", 
       SUBSTRING(title FROM 4), 
       IF(LEFT(title,4) = "The ", 
       SUBSTRING(title FROM 5), 
       title))) 

Aber angesichts dem Aufwand, dies zu tun mehr als ein paar Mal, sie ist wirklich besser dran, den Titel Sortierwert in einer anderen Spalte zu speichern ...

3

Der beste Weg, dies zu handhaben, wäre, eine Spalte zu haben, die den Wert enthält, den Sie speziell für die Bestellung der Ausgabe verwenden möchten. Dann würden Sie einfach zu verwenden:

SELECT t.title 
    FROM MOVIES t 
ORDER BY t.order_title 

Es werden verschiedene Regeln darüber sein, was sollte und sollte nicht verwendet werden, Titel zu bestellen.

Basierend auf Ihrem Beispiel eine Alternative wäre, wie etwas zu verwenden:

SELECT t.title 
    FROM MOVIES t 
ORDER BY SUBSTR(t.title, INSTR(t.title, 'The ')) 

Sie könnten eine CASE-Anweisung verwenden, um die verschiedenen Regeln zu enthalten.

3

Sie können sicher arrangieren, das 'The' dynamisch abzuziehen, obwohl Sie bald feststellen werden, dass Sie mit 'A' und 'An' zu tun haben (außer für Spezialfälle wie "A is for Alibi") . Wenn "fremde" Filme in den Mix kommen, müssen Sie mit "El" und "La" zurechtkommen (mit Ausnahme des nervtötenden Films "LA Story"). Dann mische einige deutsche Filme ein und du musst mit "Der" und "Die" fertig werden (bis auf die nervtötenden "Stirb Langsam" - Fälle). Siehst du das Muster? Sie sind auf einem Weg, der immer länger und mit Sonderfällen länger wird.

Der Weg nach vorne auf diesem, der eine ständig wachsende Reihe von Sonderfällen vermeidet, ist, den Titel zu speichern, wie Sie wollen und den Titel speichern, wie Sie es sortiert haben möchten.

+0

Sehr guter Punkt, obwohl zum Glück in meinem Fall Perfektion ist nicht notwendig, so dass diese Randfälle ignoriert werden können, zumindest für den Moment. +1 für die Erwähnung des Problems obwohl. – dimo414

0

Für SQLite

ORDER BY CASE WHEN LOWER(SUBSTR(title,1,4)) = 'the ' THEN SUBSTR(title,5) ELSE title END ASC 
1

Wege, die die erste The nur entfernen wird:

=SUBSTITUTE(A1,"The ","",1) OR more reliably: 

=IF(IF(LEFT(A1,4)="The ",TRUE)=TRUE,RIGHT(A1,(LEN(A1)-4)),A1) 

Zweite ein im Grunde sagen, wenn die erste linke Ziffer The entspricht, dann überprüfen Sie, wie viele Stellen sind in der Zelle, und zeigen Sie nur die rechten Ziffern außer The.