2010-12-19 5 views
-1

Angenommen, ich möchte die Reihenfolge der Datensätze nach einem Feld (Zeichenfolgendatentyp) namens STORY_LENGTH ordnen. Dieses Feld ist ein mehrwertiges Feld und ich stelle die mehreren Werte mithilfe von Kommas dar. Zum Beispiel ist für record1 sein Wert "1" und record2 ist sein Wert "1,3" und für record3 ist sein Wert "1,2". Jetzt, wenn ich die Datensätze nach STORY_LENGTH bestellen möchte, dann werden Datensätze wie folgt record1 > record3 > record2 bestellt. Es ist klar, dass STORY_LENGTH Datentyp String ist und order by ASC diesen Wert als String betrachtet. Aber, hier kommt das Problem. Zum Beispiel, wenn record4="10" und record5="2" und ich versuche zu bestellen sieht es wie record4 > record5 aus, was ich natürlich nicht will. Weil 2 > 10 und ich eine Zeichenfolge nur aufgrund mehrerer Werte des Feldes formatiert verwenden. Also, irgendjemand, können Sie mir dabei helfen? Ich brauche eine gute Idee, um es zu reparieren. dankeWie wird die String-Reihenfolge in der by-Klausel behandelt?

+1

Fixieren Sie Ihr Design. Einfach. – gbn

Antwort

5

Mehrwertige Felder, wie Sie beschreiben, bedeuten, dass Ihr Datenmodell defekt ist und normalized sein sollte.

Sobald dies erledigt ist, wird die Abfrage viel einfacher.

+0

Das Feld enthält mehrere Werte desselben Typs. Zum Beispiel hat ein Lied zwei Längen: 10,15 oder Single wie 10. Derzeit in einer solchen Situation, dass db Design kann nicht geändert werden .. –

+0

@ Masud Rahman - das ist bedauerlich. Möglicherweise möchten Sie eine Lösung mit dem Operator 'LIKE' suchen und die Zeichenfolge bearbeiten und filtern in der Anwendung statt in der DB. – Oded

0

Von dem, was ich verstanden habe, möchten Sie Elemente nach der zweiten oder ersten Zahl in kommagetrennten Werten in einem VARCHAR-Feld gespeichert werden. Die Umsetzung würde verwendeten Datenbank abhängig sind, beispielsweise in MySQL würde es wie folgt aussehen:

SELECT * FROM stories 
ORDER BY CAST(COALESCE(SUBSTRING_INDEX(story_length, ',', -1), '0') AS INTEGER) 

Und doch ist es im Allgemeinen nicht gut, nicht so zu verwenden, aus Leistungsgründen Sortierung als Scannen ganzer Tisch erfordern würde Sortierung anstelle der Verwendung von Index auf Feld.

Edit: Nach den Bearbeitungen sieht es so aus, als ob Sie nach dem ersten Wert sortieren und Werte nach dem Komma ignorieren möchten. Da laut einem Kommentar oben Änderungen im Datenbankdesign keine Option sind, verwenden Sie einfach folgenden Code zum Sortieren:

+0

danke. Es sieht gut aus. Ich werde es versuchen und Feedback geben –

Verwandte Themen