4 Stimmen

MySQL ORDER BY gibt Dinge in (scheinbar) zufälliger Reihenfolge zurück?

Die folgende Abfrage:

SELECT DISTINCT ClassName FROM SiteTree ORDER BY ClassName

gibt die Dinge in keiner offensichtlichen Reihenfolge zurück!

Ich erhalte das gleiche Ergebnis, egal ob ich Spalten-/Tabellennamen anführe oder die DISTINCT oder nicht, oder fügen Sie ASC o DESC .

Ich nahm an, dass die Indizes defekt sein könnten oder etwas Ähnliches, also versuchte ich, sie zu löschen und neu zu erstellen. Auch versucht REPAIR TABLE et CHECK TABLE .

Die Sortierung der Tabelle ist auf latin1_swedish_ci eingestellt. Alle Textspalten sind auf die Verwendung von UTF-8 und die Sortierung auf utf8_general_ci eingestellt.

Was könnte die Ursache dafür sein?

Edit :

Beispielhafte Daten unter Nudeln .

Die Ergebnisse stammen direkt aus einer SQL-Abfrage, die im MySQL-Client ausgeführt wurde (ich habe 2 verschiedene Client-Anwendungen ausprobiert).

3voto

Cruachan Punkte 15597

Wie wurden Ihre Daten geladen? Ich habe einige Fälle erlebt, in denen beim Laden aus einer externen Quelle ein Leerzeichen oder ein ähnliches Zeichen an die erste Stelle einer Zeichenfolge gesetzt wurde - mit dem Ergebnis, dass die zurückgegebene Ergebnismenge zwar sortiert ist, aber nicht so, wie man es erwarten würde.

Es kann unglaublich schwierig sein, so etwas zu erkennen, und wenn ich anomale Ergebnisse der Art erhalte, wie Sie sie sehen, wähle ich als Erstes das betreffende Feld aus, indem ich '>' und '<' verkette.

2voto

Luke H Punkte 2977

Heureka!

Es stimmt zwar, dass die Verwendung einer Funktion die richtige Reihenfolge liefert, z. B:

  SELECT DISTINCT ClassName FROM SiteTree ORDER BY REPLACE(ClassName,'','')

Es stellte sich heraus, dass ich eine ENUM-Spalte betrachtete (ich hatte es vergessen, ich dachte, es sei einfacher Text), und so sortierte MySQL nach der Reihenfolge der Elemente in der ENUM.

Trotzdem vielen Dank für die hilfreichen Vorschläge.

In Anbetracht der Situation ist dies eine vernünftige Lösung.

SELECT DISTINCT ClassName FROM SiteTree ORDER BY CAST(ClassName AS CHAR)

1voto

Anthony Punkte 35161

Es gibt keinen Grund, warum das nicht funktionieren sollte, und wir werden sehen, ob es einen Unterschied macht, wenn wir die Mischung aus Kameldarm loswerden:

  SELECT DISTINCT LOWER(LTRIM(ClassName)) AS classname 
  FROM SiteTree ORDER BY classname

Die Idee von Cruachan hat mir so gut gefallen, dass ich meine abwegige Idee aktualisiert habe, um sie zu übernehmen. Entfernen Sie führende Leerzeichen.

0voto

Williham Totland Punkte 27585

Es ist möglich oder sogar wahrscheinlich, dass die Tabelle sortiert ist, bevor DISTINCT ing. Versuchen Sie es mit einer Aggregatfunktion oder GROUP BY

0voto

mosheb Punkte 666

Wenn Sie die Ergebnisse auf einer Webseite betrachten, sehen Sie möglicherweise nur einen zwischengespeicherten Ergebnissatz aus einer früheren Abfrage.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X