MySQL-String-Funktionen

8

Ich habe eine Tabelle mit folgenden Daten:

%Vor%

Ich verwende diese Abfrage, um den verketteten Wert des Standorts abzurufen.

%Vor%

Das Abfrageergebnis sieht folgendermaßen aus:

%Vor%

Aber ich möchte, dass die Abfrage wie folgt aussieht: Bohol - Cebu - Manila - Bohol . Ich möchte das Ergebnis so zusammenführen. Wie kann ich das erreichen? Ich bin nicht so vertraut mit MySQL String-Funktionen, also brauche ich einige Ideen, wie dies funktioniert. Jede Hilfe wird geschätzt. Danke vielmals!

    
xjshiya 29.08.2012, 05:46
quelle

3 Antworten

6

Sie müssen SEPARATOR in GROUP_CONCAT function verwenden:

%Vor%

Beispiel: SQLFIDDLE

Es ist keine gute Übung, mehrere Werte in derselben Spalte zu speichern. Besserer Weg könnte sein:

%Vor%     
Omesh 29.08.2012, 06:08
quelle
3

Hier ist ein Weg. Er trennt die beiden Orte von Ihrer einzigen location Spalte, unterscheidet sie und fügt sie dann wieder zusammen SQL Fiddle :

%Vor%

Sie suchen vielleicht etwas Intelligenteres? Ich empfinde "Standort" ist eher wie ein "von-zu" Art von Ding? Ich frage auch die Entscheidung, mehr als einen Wert in Ihrer Spalte location zu speichern. Es wäre viel besser, wenn Sie location1 und location2 als separate Spalten speichern.

    
lc. 29.08.2012 05:57
quelle
0

Als die derzeit akzeptierte Antwort scheint Probleme verursachen später, hier ist eine weitere Alternative. Es basiert stark auf der Lösung von lc. , kümmert sich aber um die Bestellung.

Zunächst einmal: SQL-Tabellen haben keine eindeutige Zeilenreihenfolge . Wenn Sie alle Zeilen einer Tabelle abfragen, werden diese Zeilen in einer bestimmten Reihenfolge zurückgegeben. Diese Reihenfolge ist jedoch nicht definiert. Sie hängt möglicherweise nicht mit der Reihenfolge zusammen, in der Zeilen hinzugefügt wurden, und kann sich unerwartet ändern. Wenn Sie also Ihre Zeilen in einer bestimmten Reihenfolge bearbeiten möchten, sollten Sie eine Spalte hinzufügen, die eine Sequenznummer oder eine ähnliche Sequenz enthält. Das ist der Grund, warum LC. hat Sie immer wieder über die Reihenfolge der Standorte aufgehalten.

Wenn Sie eine solche Spalte namens seq haben, können Sie die folgende Abfrage verwenden:

%Vor%

Die Union erzeugt eine Liste der verschiedenen Orte, die mit der äußersten Auswahl zu einer einzigen Zeichenfolge kombiniert werden. Der erste Teil der Union ergibt die erste Hälfte des ersten Teils der Route, während der zweite Teil der Union die zweite Hälfte aller Teile ergibt. Die Reihenfolge des Union-Ergebnisses ist bisher undefiniert, daher benötigen wir eine allgemeine Ordnungsregel. Wir brauchen auch eine Bestellregel für die erste Hälfte, so dass wir wirklich den ersten Teil der Route mit der Limit-Klausel wählen.

Hier ist ein sqlfiddle basierend auf dem One-Omesh-Setup. In Ermangelung einer seq -Spalte wird die Spalte icode verwendet, um Dinge zu sortieren. Daher weicht das Ergebnis von dem erwarteten Ergebnis ab und stattdessen Manila - Bohol - Cebu - Manila .

Wenn Sie eine seq -Spalte hinzufügen, müssen Sie das Datenbankschema ändern. Sie können es also so ändern, dass die beiden Endpunkte jedes Teils in zwei verschiedene Spalten umgewandelt werden. Die Kombination von Spalten mit CONCAT ist einfach, aber die Aufteilung der Spalten erhöht die Komplexität der Abfragen sowohl für den Entwickler als auch für das Datenbankmodul.

Wenn Sie keine Sequenzspalte hinzufügen können, weil Sie keine Kontrolle über das Datenbankschema haben, liegt ein Problem vor. Ihr Kommentar hier zeigt an, dass Sie immer nach einem Zyklus suchen, aber einen solchen finden Der Zyklus von ungeordneten Daten erfolgt am besten mit Hilfe einer Karte , die auf SQL-Ebene nicht verfügbar ist. Sie können dies durch eine gespeicherte Prozedur erreichen, wenn Sie müssen, eine Auswahl für jeden Teil der jurney ausführen, aber ich würde lieber dies auf der Anwendungsebene angehen, wenn ich Sie wäre.

    
MvG 05.09.2012 09:05
quelle

Tags und Links