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

Mysql: Select ordenado por final de cadena

Estas en el tema de Mysql: Select ordenado por final de cadena en el foro de Mysql en Foros del Web. Hola, en una tabla tengo una columna que contiene varias cadenas organizadas con separadores. Por ejemplo: ID | Producto | Categorias ----+------------------+--------------------------------------- 1 | producto ...
  #1 (permalink)  
Antiguo 11/06/2011, 17:39
 
Fecha de Ingreso: noviembre-2002
Ubicación: Ramos Mejía - Buenos Aire
Mensajes: 36
Antigüedad: 22 años
Puntos: 1
Pregunta Mysql: Select ordenado por final de cadena

Hola, en una tabla tengo una columna que contiene varias cadenas organizadas con separadores.

Por ejemplo:

ID | Producto | Categorias
----+------------------+---------------------------------------
1 | producto 1 | cate_1#3 cate_4#2
2 | producto 2 | cate_2#1 cate_5#6 cate_1#3
3 | producto 3 | cate_1#2


Obviamente son productos que comparten una misma tabla y que pueden pertenecer a un número infinito de categorías.

Si realizo un select para la categoría Nº 1 con esta sintaxis:

SELECT * FROM prueba WHERE categorias LIKE '%cate_1#%'

Me devuelve los productos que contienen cate_1#, hasta ahí ok.

Lo que necesito es poder ordenar los resultados por el nro. que aparece luego del signo numeral (#) en la cadena de categoría.

En el ejemplo, debería devolverme:

ID: 2,3,1


Puedo utilizar un array para guardar los resultados y luego ordenarlos, pero quería saber si se les ocurre otra idea para ahorrar tiempo.

Muchas gracias.
__________________
Porque lo importante no es lo que hacemos sino como lo hacemos...
  #2 (permalink)  
Antiguo 12/06/2011, 18:09
Avatar de lair  
Fecha de Ingreso: enero-2009
Ubicación: header('Location: Morelia");
Mensajes: 1.052
Antigüedad: 15 años, 10 meses
Puntos: 46
Respuesta: Mysql: Select ordenado por final de cadena

hola.

Prueba con algo como esto:
Código MySQL:
Ver original
  1. select prueba.*, substr(prueba.categoria,-1) as ORDEN FROM prueba WHERE categorias LIKE '%cate_1#%' order by ORDEN

Suerte.
  #3 (permalink)  
Antiguo 13/06/2011, 09:26
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Mensaje Respuesta: Mysql: Select ordenado por final de cadena

Hola Scorpiatus:

Cita:
En el ejemplo, debería devolverme:

ID: 2,3,1
No termino por identificar por qué dices que te debe regresar los registros en este orden. Creo que hay un error en los datos pero veamos si estoy en lo correcto. Según lo que entendí el #numero representa el orden en que deberían presentarse cada producto por categoría. En el ejemplo SI SÓLO TOMAMOS EN CUENTA LOS DATOS DE CATE_1 tendríamos los siguientes datos:

[HIGHLIGHT="SQL"]
Código SQL:
Ver original
  1. ID | Producto | Categorias
  2. ----+------------------+---------------------------------------
  3. 1 | producto 1 | cate_1#3
  4. 2 | producto 2 | cate_1#3
  5. 3 | producto 3 | cate_1#2

como vez NO EXISTE EN TUS REGISTROS NINGÚN REGISTRO CON CATE_1#1, por lo tanto el orden en que debería presentar los datos según yo sería 3, 1, 2 para este ejemplo. Esto podrías lograrlo más o menos así:

Código MySQL:
Ver original
  1. mysql> create table prueba (ID int, Producto varchar(15),
  2.     -> Categorias varchar(50));
  3. Query OK, 0 rows affected (0.14 sec)
  4.  
  5. mysql> insert into prueba values (1, 'producto 1', 'cate_1#3 cate_4#2'),
  6.     -> (2, 'producto 2', 'cate_2#1 cate_5#6 cate_1#3'),
  7.     -> (3, 'producto 3', 'cate_1#2');
  8. Query OK, 3 rows affected (0.02 sec)
  9. Records: 3  Duplicates: 0  Warnings: 0
  10.  
  11. mysql> select * from prueba;
  12. +------+------------+----------------------------+
  13. | ID   | Producto   | Categorias                 |
  14. +------+------------+----------------------------+
  15. |    1 | producto 1 | cate_1#3 cate_4#2          |
  16. |    2 | producto 2 | cate_2#1 cate_5#6 cate_1#3 |
  17. |    3 | producto 3 | cate_1#2                   |
  18. +------+------------+----------------------------+
  19. 3 rows in set (0.00 sec)
  20.  
  21. mysql> select p.*,
  22.     -> SUBSTRING_INDEX(substring(Categorias, INSTR(Categorias, 'cate_1'), length
  23. (Categorias)), ' ', 1) orden
  24.     -> from prueba p where Categorias LIKE '%cate_1#%'
  25.     -> order by substring(orden, -1);
  26. +------+------------+----------------------------+----------+
  27. | ID   | Producto   | Categorias                 | orden    |
  28. +------+------------+----------------------------+----------+
  29. |    3 | producto 3 | cate_1#2                   | cate_1#2 |
  30. |    1 | producto 1 | cate_1#3 cate_4#2          | cate_1#3 |
  31. |    2 | producto 2 | cate_2#1 cate_5#6 cate_1#3 | cate_1#3 |
  32. +------+------------+----------------------------+----------+
  33. 3 rows in set (0.00 sec)

Ahora bien, cuando dices

Cita:
pueden pertenecer a un número infinito de categorías.
El modelo deja de ser práctico, ya que tendrás un enorme desperdicio de recursos al tener que manejar una columna de tipo texto enorme. En lugar de esto creo que lo ideal hubiera sido que manejaras dos tablas de catálogo (productos y categorías) y una tabla Productos-Categorías de tal manera que tus datos fueran más o menos así:

Código:
PRODUCTOS:
IDProducto|Producto
---------------------------------
1|producto 1
2|producto 2
3|producto 3


CATEGORIAS:
IDCategoria|Descripcion
----------------------------------
1|Cate_1
2|Cate_2
3|Cate_3

PRODUCTOS_CATEGORIAS
idProdCat|idProducto|idCatetgoria|Orden
------------------------------------------------------
1|1|1|3
2|2|1|1
3|3|1|2
4|2|2|1
5|3|3|1
Si tienes oportunidad de cambiar tu modelo de datos te recomiendo que lo hagas, te evitarás muchos problemas en el futuro.

Saludos
Leo.

Etiquetas: ordenamiento, php, resultados
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 12:12.