Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] CONCAT Ordenado

Estas en el tema de CONCAT Ordenado en el foro de Mysql en Foros del Web. Hola, tengo una duda pequeña pero que desconozco su respuesta: ¿Es posible concatenar una serie de columnas de forma ordenada? Es decir, tengo: -- tabla1 ...
  #1 (permalink)  
Antiguo 01/03/2015, 21:09
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
CONCAT Ordenado

Hola, tengo una duda pequeña pero que desconozco su respuesta:

¿Es posible concatenar una serie de columnas de forma ordenada?

Es decir, tengo:

-- tabla1 --
campo1 integer
campo2 integer
campo3 integer

Algunos datos:

campo1 | campo2 | campo3
4 | 2 | 3
5 | 1 | 6
1 | 8 | 2

y quiero un select que me devuelva:
2,3,4
1,5,6
1,2,8

Algo similar a concat pero que permita ordenar según el valor que tenga, ¿Existe algo en mysql o tengo que crear mi propia funcion?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 02/03/2015, 02:57
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: CONCAT Ordenado

Lo ordenamientos en SQL sólo aplican a REGISTROS, no a columnas.
No existe funcionalidad en SQL capaz de hacer lo que quieres. Lo tendrás que resolver por programación.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 03/03/2015, 09:54
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años, 7 meses
Puntos: 320
Respuesta: CONCAT Ordenado

Lo resolvi con esta funcion:
Código MySQL:
Ver original
  1. DELIMITER |
  2.   DECLARE delim CHAR(1) DEFAULT ',';
  3.   DECLARE strings INT DEFAULT 0;
  4.   DECLARE forward INT DEFAULT 1;
  5.   DECLARE backward INT;
  6.   DECLARE remain TEXT;
  7.   DECLARE swap1 TEXT;
  8.   DECLARE swap2 TEXT;
  9.   SET remain = inString;
  10.   SET backward = LOCATE(delim, remain);
  11.   WHILE backward != 0 DO
  12.     SET strings = strings + 1;
  13.     SET backward = LOCATE(delim, remain);
  14.     SET remain = SUBSTRING(remain, backward+1);
  15.   END WHILE;
  16.   IF strings < 2 THEN RETURN inString; END IF;
  17.     SET backward = strings;
  18.     REPEAT
  19.       SET swap1 = SUBSTRING_INDEX(SUBSTRING_INDEX(inString,delim,backward-1),delim,-1);
  20.       SET swap2 = SUBSTRING_INDEX(SUBSTRING_INDEX(inString,delim,backward),delim,-1);
  21.       IF  swap1 > swap2 THEN
  22.         SET inString = TRIM(BOTH delim FROM CONCAT_WS(delim
  23.         ,SUBSTRING_INDEX(inString,delim,backward-2)
  24.         ,swap2,swap1
  25.         ,SUBSTRING_INDEX(inString,delim,(backward-strings))));
  26.       END IF;
  27.       SET backward = backward - 1;
  28.     UNTIL backward < 2 END REPEAT;
  29.     SET forward = forward +1;
  30.   UNTIL forward + 1 > strings
  31. RETURN inString;
  32. END |
  33. DELIMITER;

Se la usa asi:
Código MySQL:
Ver original
  1. SELECT SORT(CONCAT_WS(',', 5, 1, 6)) ordenada; -- 1,5,6
  2. SELECT SORT(CONCAT_WS(',', campo1, campo2, campo3)) ordenada FROM tabla1;
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: campo, concat, ordenado, select, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:54.