MySQL alphabetisch sortieren, aber "das" ignorieren

7

Ich habe eine MySQL-Datenbank, die eine Tabelle mit Buchdaten enthält. Eine der Spalten in der Tabelle heißt "Titel". Einige der Titel beginnen mit dem Wort "the" und manche nicht.

Beispiel:

  • "Der Buchtitel Eins"
  • "Buchtitel zwei"
  • "Buchtitel drei"

Ich muss diese in alphabetischer Reihenfolge aus der Datenbank ziehen, aber ich muss das "das" am Anfang der Titel ignorieren, die damit beginnen.

Bietet SQL (speziell MySQL) eine Möglichkeit, dies in der Abfrage zu tun?

    
Joe Hoskinson 31.01.2012, 21:59
quelle

6 Antworten

9

tue einen Fall, in dem überprüft werden soll, ob der Spaltenwert mit dem beginnt, und wenn dies der Fall ist, gib den Titel ohne das 'The' zurück. Dies ist eine neue Spalte, die Sie später für die Sortierreihenfolge verwenden werden

%Vor%     
Melvin Protacio 31.01.2012 22:02
quelle
5

Sie können eine CASE -Anweisung in ORDER BY und die Verwendung REGEXP oder LIKE verwenden, um Strings zu finden, die mit Wörtern beginnen, die Sie entfernen möchten.

Im folgenden Beispiel finden Sie alle Wörter, die mit a , ein oder das gefolgt von einem Leerzeichen beginnen, und entfernen dann alles bis zum Leerzeichen, und entfernen Sie zusätzlichen Leerraum (Sie haben möglicherweise zwei oder Leerzeichen nach einer Instanz von das ).

%Vor%     
Daniel Gimenez 09.10.2013 18:09
quelle
4

Wenn Sie sicher sind, dass Sie NIEMALS einen Tippfehler haben werden (und Kleinbuchstaben anstelle von Großbuchstaben verwenden)

%Vor%

Sonst macht Ihre Sortierung alle oberen und dann alle unteren.

zum Beispiel ist dies eine aufsteigende Reihenfolge:

%Vor%

aus der AJP-Antwort übernommen

    
tony gil 07.02.2014 19:03
quelle
1
%Vor%

Bitte beachten Sie, dass dies den Titel vom Titel ersetzt, egal wo im Titel. Verwenden Sie also die Teilzeichenfolge, um die ersten drei Zeichen zu erhalten.

    
AJP 31.01.2012 22:09
quelle
1

Ich habe hier ein paar verworrene Antworten gesehen, die ich ausprobiert habe, die aber nur falsch waren (nicht funktionierten) oder unsicher waren (ersetzt jedes Vorkommen von "das"). Die Lösung, die ich für einfach halte, oder vielleicht bekomme ich es falsch oder beziehe keine Randfälle (aufrichtig, kein Sarkasmus beabsichtigt).

%Vor%

Wie bereits an anderer Stelle erwähnt, verhindert UPPER nur die ASCII-Sortierung, die B vor a anordnet (beachten Sie die Falldifferenz).

Es gibt keine Notwendigkeit für eine switch-case -Anweisung, wenn es nur eine Bedingung gibt, IF() wird es tun

Ich benutze MySQL 5.6 und es scheint, als ob die String-Funktionen 1-indexiert sind, im Gegensatz zu PHP, wo Strings 0-indexiert sind (das hat mich erwischt). Ich habe das oben auf meinem Dataset getestet und es funktioniert

    
Luke Madhanga 02.01.2016 00:48
quelle
0

Einfach:

%Vor%

Erklärung:

Wir verwenden die Funktion IF , um das "The" (falls vorhanden) vom Anfang der Zeichenfolge zu entfernen, bevor die Zeichenfolge an die ORDER BY -Klausel zurückgegeben wird. Für komplexere Alphabetisierungsregeln könnten wir eine benutzerdefinierte Funktion erstellen und diese stattdessen in der ORDER BY -Klausel platzieren. Dann hätten Sie ...ORDER BY MyFunction(Title) .

    
Andrew 14.09.2016 02:12
quelle

Tags und Links