Como the currently accepted answer parece cause problems más adelante, aquí hay otra alternativa. Se basa en gran medida en the solution by lc., pero se encarga de ordenar.
En primer lugar, las tablas de SQL tienen sin orden de fila bien definida. Cuando consulta todas las filas de una tabla, esas filas se devolverán en un orden determinado, pero esa orden no está definida, puede estar o no relacionada con el orden en que se agregaron las filas y puede cambiar inesperadamente. Entonces, cuando desee procesar sus filas en un orden determinado, debe agregar una columna para contener algún tipo de número de secuencia o smilar. Esa es la razón por la cual lc. kept bugging you sobre el orden de las ubicaciones.
Si tiene una columna de este tipo, llamado seq
, a continuación, puede utilizar la siguiente consulta:
SELECT GROUP_CONCAT(loc SEPARATOR ' - ')
FROM (
(SELECT 1 half, seq, SUBSTRING_INDEX(location, ' - ', 1) loc
FROM location_list
WHERE reservno='00004'
ORDER BY seq
LIMIT 1)
UNION ALL
(SELECT 2 half, seq, SUBSTRING_INDEX(location, ' - ', -1) loc
FROM location_list
WHERE reservno='00004')
ORDER BY half, seq
) locs
La unión producirá una lista de los distintos lugares, que se combina en una sola cadena utilizando la más externa seleccionar. La primera parte de la unión produce la primera mitad de la primera parte de la ruta, mientras que la segunda parte de la unión le dará la segunda mitad de todas las partes. El orden del resultado de la unión no está definido hasta el momento, por lo que necesitamos una regla general de ordenamiento. También necesitamos una regla de pedido para la primera mitad, de modo que realmente elijamos la primera parte de la ruta con la cláusula de límite.
Here es un sqlfiddle basado en la configuración de Omesh.A falta de una columna seq
, usa la columna icode
para pedir cosas. Por lo tanto, el resultado difiere del que esperaba y, en su lugar, produce Manila - Bohol - Cebu - Manila
.
Si agrega una columna seq
, tendrá que cambiar el esquema de la base de datos, por lo que también puede cambiarlo de forma que los dos extremos de cada parte se conviertan en dos columnas distintas. Combinar columnas usando CONCAT
es simple, pero dividirlas aumenta la complejidad de las consultas tanto para el desarrollador como para el motor de la base de datos.
Si no puede agregar una columna de secuencia, porque no tiene control sobre el esquema de la base de datos, entonces tiene problemas. Your comment here indica que siempre está buscando un ciclo, pero encontrar dicho ciclo a partir de datos desordenados se hace mejor usando un map, que no está disponible en el nivel de SQL. Podrías lograr esto a través de un procedimiento almacenado si es necesario, ejecutando uno para cada parte del jurney, pero prefiero abordar esto a nivel de aplicación si fuera tú.
¿Cómo se determina el orden en que se deben unir los registros? – eggyal